如何:在托管 Windows 服务中承载 WCF 服务
本主题概述了创建由 Windows 服务承载的 Windows Communication Foundation (WCF) 服务所需的基本步骤。此方案可通过托管 Windows 服务承载选项启用,此选项是在没有消息激活的安全环境中在 Internet 信息服务 (IIS) 外部承载的、长时间运行的 WCF 服务。服务的生存期改由操作系统控制。此宿主选项在 Windows 的所有版本中都是可用的。
可以使用 Microsoft 管理控制台 (MMC) 中的 Microsoft.ManagementConsole.SnapIn 管理 Windows 服务,并且可以将其配置为在系统启动时自动启动。此承载选项包括注册承载 WCF 服务作为托管 Windows 服务的应用程序域,因此服务的进程生存期由 Windows 服务的服务控制管理器 (SCM) 来控制。
服务代码包括服务协定的服务实现、Windows 服务类和安装程序类。服务实现类 CalculatorService 是 WCF 服务。CalculatorWindowsService 是 Windows 服务。要符合 Windows 服务的要求,该类继承自 ServiceBase 并实现 OnStart 和 OnStop 方法。在 OnStart 中,将为 CalculatorService 类型创建 ServiceHost 并打开它。在 OnStop 中,停止并释放服务。主机还负责提供服务主机基址,该基址已在应用程序设置中进行设置。安装程序类继承自 Installer,允许程序通过 Installutil.exe 工具安装为 Windows 服务。
构造服务并提供宿主代码
使用 Service.cs 文件中的计算器服务接口来定义 ICalculator 服务协定。
通过从 WCF ICalculator 接口继承,在 Service.cs 文件的 CalculatorService 类中实现服务协定作为 WCF 服务。
通过从 ServiceBase 类继承来实现 Windows 服务。重写 OnStart 方法以创建并打开 ServiceHost 的实例。重写 OnStop 方法以关闭 ServiceHost 的实例。创建 CalculatorService 实例的实例并将其命名为“WCFWindowsServiceSample”。提供应用程序的入口点。
创建 ProjectInstaller 类,此类继承自 Installer 并用设置为 true 的 RunInstallerAttribute 来标记,因此,在安装程序集时将调用 Visual Studio 的自定义操作安装程序或 Installutil.exe。
在配置中提供服务的基址。
安装并运行服务
编译服务以生成 Service.exe 可执行文件。
在命令提示符处键入
installutil bin\service.exe
来安装 Windows 服务。(如果尚未设置该工具的路径,则该工具放置在 Microsoft.NET Framework 安装目录中。)在命令提示符处键入services.msc
以访问服务控制管理器 (SCM)。WINDOWS 服务应作为“WCFWindowsServiceSample”出现在服务中。只有在 Windows 服务正在运行的情况下,WCF 服务才能响应客户端。若要启动服务,请在 SCM 中右击服务并选中“启动”,或在命令提示符处键入net start
WCFWindowsServiceSample
。如果对服务进行更改,则必须首先停止并卸载服务。若要停止服务,请在 SCM 中右击服务并选中“停止”,或在命令提示符处键入
net stop
WCFWindowsServiceSample
。请注意,如果停止 WINDOWS 服务然后运行客户端,则在客户端尝试访问服务时发生 EndpointNotFoundException 异常。若要卸载 WINDOWS 服务,请在命令提示符处键入installutil /u
bin\service.exe
。
示例
下面的代码演示如何将 Service.cs 文件的内容用于协定、协定的实现以及 WINDOWS 服务安装和宿主代码。
与“自承载”选项一样,Windows 服务主机环境要求写入一些宿主代码作为应用程序的一部分。服务作为一个 .exe 程序实现,并包含其自己的宿主代码。在其他宿主环境(如 Internet 信息服务 (IIS) 中的 Windows 进程激活服务 (WAS) 宿主)中,开发人员没有必要编写宿主代码。