摘要
使用 Microsoft .NET Framework Remoting 功能生成的远程对象必须承载在 Microsoft Windows 服务、自定义可执行文件或 ASP.NET 中,以使客户端应用程序可以访问这些对象。本模块描述如何在 Windows 服务中承载远程对象并从客户端应用程序调用它。
预备知识
在开始使用本模块之前,应了解下列内容:
• 远程对象(即使用 .NET Remoting 技术远程访问的 .NET 对象)可以承载在 Windows 服务、自定义可执行文件或 ASP.NET 中。
• 客户端使用 TCP 信道与自定义可执行文件或 Windows 服务中承载的远程对象通讯。
• 客户端使用 HTTP 信道与 ASP.NET 中承载的远程对象通讯。
• 如果主要考虑安全问题,则应在 ASP.NET 中承载对象并使用 HTTP 信道。这样您可以从 ASP.NET 和 IIS 的底层安全功能中获益。
有关如何在 ASP.NET(带 IIS)中承载远程对象的信息,请参阅 Microsoft 知识库中编号为 312107 的文章“指导性文章:在 Microsoft Internet 信息服务中承载远程对象”,网址是 http://support.microsoft.com/default.aspx?scid=312107。
• 如果主要考虑性能问题,则应在 Windows 服务中承载对象并使用 TCP 信道。此选项不提供内置的安全性。
创建远程对象类
此过程创建一个简单的远程对象类。它提供了一个名为 Add 的简单方法,用于将两个数字加在一起并返回结果。
要创建远程对象类,请执行下列操作:
• 启动 Visual Studio .NET 并创建一个新的名为 RemoteObject 的 Visual C# 类库项目。
• 使用解决方案资源管理器将 class1.cs 重命名为 Calculator.cs。
• 在 Calculator.cs 中,将 Class1 重命名为 Calculator,并相应地重命名默认的构造函数。
• 从 MarshalByRefObject 派生 Calculator 类,以便使此类成为远程的类。
public class Calculator : MarshalByRefObject
• 将下列公共方法添加到 Calculator 类中。
public int Add( int operand1, int operand2 )
{
return operand1 + operand2;
}
• 在 Build 菜单中,单击 BuildSolution。
创建一个 Windows 服务宿主应用程序
此过程创建一个 Windows 服务应用程序,用于承载远程对象。当服务启动时,它将配置 TCP 远程信道来侦听客户端请求。
注 此过程使用一个 Installer 类和 Installutil.exe 命令行实用工具来安装 Windows 服务。要卸载此服务,请运行带有 /u 开关的 Installutil.exe。还有另一种方法,可以使用“安装和部署项目”来帮助安装和卸载 Windows 服务。
要创建 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() };
6.定位到 InitializeComponent 方法,并将 ServiceName 属性设置为 RemotingHost。
this.ServiceName = "RemotingHost";
7.定位到 OnStart 方法,并添加下列代码行来配置远程处理。到配置文件的完全限定路径将作为启动参数传递给服务。
RemotingConfiguration.Configure(args[0]);
8.将一个新的 C# 类文件添加到此项目,并将其命名为 HostServiceInstaller。
9.添加一个对 System.Configuration.Install.dll 程序集的程序集引用。
10.将下列 using 语句添加到 HostServiceInstaller 顶部现有 using 语句的下面。
using System.ComponentModel;
using System.ServiceProcess;
using System.Configuration.Install;
11.从 Installer 类派生 HostServiceInstaller 类。
public class HostServiceInstaller : Installer
12.在类级添加 RunInstaller 属性,如下所示:
[RunInstaller(true)]
public class HostServiceInstaller : Installer
13.将下列两个私有成员变量添加到 HostServiceInstaller 类。当安装此服务时将使用这些对象。
private ServiceInstaller HostInstaller;
private ServiceProcessInstaller HostProcessInstaller;
14.将下列代码添加到 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);
15.在解决方案管理器内,右击 RemotingHost,指向 Add,然后单击 Add New Item。
16.在 Templates 列表中,单击 TextFile 并将此文件命名为 app.config。
名为 app.config 的配置文件作为生成过程的一部分由 Visual Studio .NET 自动复制到输出文件夹(例如,<projectdirindebug),并重命名为 <applicationname.config。
17.单击 OK 添加新配置文件。
18.将下列配置元素添加到新配置文件中。
<configuration
<system.runtime.remoting
<application name="RemoteHostService"
<service
<wellknown type="RemoteObject.Calculator, RemoteObject"
objectUri="RemoteObject.Calculator" mode="Singleton" /
</service
<channels
<channel ref="tcp" port="8085"
<serverProviders
<formatter ref="binary" /
</serverProviders
</channel
</channels
</application
</system.runtime.remoting
</configuration
19.在 Build 菜单上,单击 Build Solution。
创建一个 Windows 帐户来运行服务
此过程创建用于运行 Windows 服务的 Windows 帐户。
要创建一个 Windows 帐户来运行服务,请执行下列操作:
1.创建一个新的名为 RemotingAccount 的本地用户帐户。输入密码并选择 Password never expires 复选框。
2.在 AdministrativeTools 程序组中,单击 Local Security Policy。
3.使用 LocalSecurityPolicy 工具为此新帐户授予 Log on as a service 特权。
安装 Windows 服务
此过程使用 installutil.exe 实用工具安装 Windows 服务,然后启动此服务。
要安装 Windows 服务,请执行下列操作:
• 打开一个命令窗口,并将目录更改到 RemotingHost 项目文件夹下的 BinDebug 目录。
• 运行 installutil.exe 实用工具来安装此服务。
installutil.exe remotinghost.exe
• 在 SetServiceLogin 对话框中,输入此前在前一个过程中创建的帐户的用户名和密码,然后单击 OK。
查看 installutil.exe 实用工具的输出,并确认此服务已正确安装。
• 将 RemoteObject.dll 程序集复制到 RemotingHost 项目输出目录(即 RemotingHostBinDebug)。
• 从 AdministrativeTools 程序组中,启动 Services MMC 管理单元。
• 在 Services 列表中,右击 Calculator Host Service,然后单击 Properties。
• 将到服务的配置文件(remotinghost.exe.config)的完整路径输入到 Start parameters 字段。
注 快速执行此操作的方法是选择并复制 Path to executable字段,并将其粘贴到 Startparameters 字段中。然后,附加“.config”字符串。
• 单击 Start 启动服务。
• 确认服务状态更改为 Started。
• 单击 OK 关闭 Properties 对话框。
创建一个测试客户端应用程序
此过程创建一个用于调用 Windows 服务内远程对象的测试控制台应用程序。
要创建测试客户端应用程序,请执行下列操作:
• 将一个名为 RemotingClient 的新 Visual C# 控制台应用程序添加到当前解决方案。
• 在解决方案资源管理器中,右击 RemotingClient,然后单击 Set as StartUp Project。
• 添加对 System.Runtime.Remoti