在 windows 服务中驻留远程对象

在windows 服务中驻留远程对象:

因为控制台应用程序不能由windows服务提供,因此不要尝试读取或写入到控制台。可以使用windows服务向文件或者事件日志发送跟踪或错误消息。System.Diagnostics.EventLog类提供了对windows事件日志读写的方法。

下面是远程对象使用的程序集: MathLibrary.dll

using System;
using System.Runtime.Remoting;
using System.Diagnostics;
namespace MathLibrary
{
///

1<summary>   
2/// SimpleMath 的摘要说明。   
3/// </summary>

public class SimpleMath : MarshalByRefObject
{
public SimpleMath()
{
WriteLogEntry("SimpleMath actor called");
}
public int Add(int n1,int n2)
{
WriteLogEntry(string.Format("SimpleMath.Add({0},{1})",n1,n2)); return n1 + n2;
}
public int Subtract(int n1,int n2)
{
WriteLogEntry(string.Format("SimpleMath.Subtract({0},{1})",n1,n2)); return n1 - n2;
}
public void WriteLogEntry(string msg){
EventLog.WriteEntry("MathService",msg);
}
}
}

建立windows服务:

新建立一个windows服务项目,命名为 MathService,下面是OnStart()方法中的对远程对象的注册:

protected override void OnStart(string[] args)
{
HttpChannel channel = new HttpChannel(13101);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(MathLibrary.SimpleMath),"SimpleMath.soap",WellKnownObjectMode.Singleton);
}

通过Installutil.exe可以安装或卸载windows服务。

Installutil directory\MathService.exe //安装
Installutil directory\MathService.exe //卸载

启动windows服务后,可以利用下面的客户端测试,同时,可以在事件查看器中查看相应的消息。

客户端程序:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

using MathLibrary;
namespace MathClient
{
///

1<summary>   
2/// ClientMain 的摘要说明。   
3/// </summary>

class ClientMain
{
///

1<summary>   
2/// 应用程序的主入口点。   
3/// </summary>

[STAThread]
static void Main(string[] args)
{
HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel);

object remoteObj = Activator.GetObject(typeof(MathLibrary.SimpleMath)," http://localhost/13101/SimpleMath.soap ");
SimpleMath math = (SimpleMath)remoteObj;

do{
Console.WriteLine(" 5 + 2 = {0}",math.Add(5,2));
Console.WriteLine(" 5 - 2 = {0}",math.Subtract(5,2));
}while(Console.ReadLine() != "q");

Console.WriteLine("Press Enter to end");
Console.ReadLine();
}
}
}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus