如何在 Windows 服务中承载一个远程对象(remoting)

 
创建远程对象类
此过程创建一个简单的远程对象类。它提供了一个名为 Add 的简单方法,用于将两个数字加在一起并返回结果。
1、启动 Visual Studio .NET 并创建一个新的名为 RemoteObject 的 Visual C# 类库项目。
2、使用解决方案资源管理器将 class1.cs 重命名为 Calculator.cs。
3、在 Calculator.cs 中,将 Class1 重命名为 Calculator,并相应地重命名默认的构造函数。
4、从 MarshalByRefObject 派生 Calculator 类,以便使此类成为远程的类。
5、public class Calculator : MarshalByRefObject
6、将下列公共方法添加到 Calculator 类中。
public int Add( int operand1, int operand2 )
{return operand1 + operand2;}
创建一个 Windows 服务宿主应用程序
此过程创建一个 Windows 服务应用程序,用于承载远程对象。当服务启动时,它将配置 TCP 远程信道来侦听客户端请求。
注 此过程使用一个 Installer 类和 Installutil.exe 命令行实用工具来安装 Windows 服务。要卸载此服务,请运行带有 /u 开关的 Installutil.exe。还有另一种方法,可以使用“安装和部署项目”来帮助安装和卸载 Windows 服务。
1、向当前解决方案中添加一个新的名为 RemotingHost 的 Visual C# Windows 服务项目。
2、使用解决方案资源管理器将 Service1.cs.cs 重命名为 RemotingHost.cs。
3、在 RemotingHost.cs 中,将 Service1 类重命名为 HostService,并相应地重命名默认构造函数。
4、在文件顶部,将下列 using 语句添加到现有的 using 语句下。
using System.Runtime.Remoting;
5、定位到 Main 方法,并用下列代码替换初始化 ServicesToRun 变量的现有代码行。
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new HostService() };
7、定位到 InitializeComponent 方法,并将 ServiceName 属性设置为 RemotingHost。
this.ServiceName = "RemotingHost";
8、定位到 OnStart 方法,并添加下列代码行来配置远程处理。到配置文件的完全限定路径将作为启动参数传递给服务。
RemotingConfiguration.Configure(args[0]);
9、将一个新的 C# 类文件添加到此项目,并将其命名为 HostServiceInstaller。
10、添加一个对 System.Configuration.Install.dll 程序集的程序集引用。
11、将下列 using 语句添加到 HostServiceInstaller 顶部现有 using 语句的下面。
 using System.ComponentModel;
using System.ServiceProcess;
using System.Configuration.Install;
12、从 Installer 类派生 HostServiceInstaller 类。
public class HostServiceInstaller : Installer
13、在类级添加 RunInstaller 属性,如下所示:
[RunInstaller(true)]
public class HostServiceInstaller : Installer
14、将下列两个私有成员变量添加到 HostServiceInstaller 类。当安装此服务时将使用这些对象。
private ServiceInstaller HostInstaller;
private ServiceProcessInstaller HostProcessInstaller;
15、将下列代码添加到 HostServiceInstaller 类的构造函数。
HostInstaller = new ServiceInstaller();
HostInstaller.StartType = System.ServiceProcess.ServiceStartMode.Manual;
HostInstaller.ServiceName = "RemotingHost";
HostInstaller.DisplayName = "Calculator Host Service";
Installers.Add(HostInstaller);
HostProcessInstaller = new ServiceProcessInstaller();
HostProcessInstaller.Account = ServiceAccount.User;
Installers.Add(HostProcessInstaller);
16、在解决方案管理器内,右 RemotingHost 添加 app.config
< configuration >
< system.runtime.remoting >
 <applicationname="RemoteHostService">
    <service>
      <wellknowntype="RemoteObject.Calculator, RemoteObject"
                 objectUri ="RemoteObject.Calculator" mode ="Singleton" />
    </service>
    <channels>
      <channelref="tcp"port="8085">
        <serverProviders>
          <formatterref="binary"/>
        </serverProviders>
      </channel>
    </channels>
 </application>
</ system.runtime.remoting >
</ configuration >
 
创建一个 Windows 帐户来运行服务
1, 创建一个新的名为 RemotingAccount 的本地用户帐户。输入密码并选择 Password never expires (密码永不过期 ) 复选框。
2, Administrative Tools(管理工具 ) 程序 中, 单击 Local Security Policy(本地安全策略 ) ( 注:在 windows 命令 “secpol.msc” )
3, 使用 Local Security Policy(本地安全策略 ) 工具 此新 帐户 授予 Log on as a service 作为服务登录
 
安装 Windows 服务
1, 打开一个命令窗口,并将目录更改到 RemotingHost 项目文件夹下的 Bin/Debug 目录。
运行 installutil.exe 实用工具来安装此服务。 installutil.exe remotinghost.exe
2, Set Service Login 对话框中,输入此前在前一个过程中创建的帐户的用户名和密码,然后单击 OK
3, RemoteObject.dll 程序集复制到 RemotingHost 项目输出目录(即 RemotingHost/Bin/Debug )。
4, Administrative Tools (管理工具 ) 程序组中,启动 Services(服务 ) MMC 管理单元。
5, Services (服务 ) 列表中,右击 Calculator Host Service(Calculator 宿主服务 ) ,然后单击 Properties
6, 将到服务的配置文件( remotinghost.exe.config )的完整路径输入到 Start parameters 字段。
7, 单击 Start 启动服务。确认服务状态更改为 Started
 
创建一个测试客户端应用程序
将一个名为 RemotingClient 的新 Visual C# 控制台应用程序添加到当前解决方案。
在解决方案资源管理器中,右击 RemotingClient ,然后单击 Set as StartUp Project
添加对 System.Runtime.Remoting.dll 程序集的引用。
添加一个对 RemoteObject 项目的项目引用。
将下列 using 语句添加到 class1.cs 顶部的现有 using 语句下。
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
将下列测试代码添加到 Main 方法中来调用 Windows 服务承载的 Calculator 对象。
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
Calculator calc = (Calculator)Activator.GetObject(typeof(RemoteObject.Calculator),
                        "tcp://localhost:8085/RemoteObject.Calculator");
if (calc == null)
 System.Console.WriteLine("Could not locate server");
Else
 Console.WriteLine("21 + 21 is : " + calc.Add(21,21) );
运行此客户端应用程序,并确认在控制台输出窗口中显示了正确的结果。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值