要使服务处于主动状态,它必须在一个运行时环境中进行托管,以创建服务,并控制其上下文和生命周期。 Windows Communication Foundation (WCF) 服务旨在在任何支持托管代码的 Windows 进程中运行。
WCF 提供用于生成面向服务的应用程序的统一编程模型。 此编程模型保持一致,独立于部署服务的运行时环境。 实际上,这意味着服务的代码看起来与托管选项完全相同。
这些托管选项的范围从在控制台应用程序内部运行到服务器环境,例如在由 Internet Information Services(IIS)或 Windows 进程激活服务(WAS)管理的工作进程中运行的 Windows 服务。 开发人员选择满足服务部署要求的托管环境。 这些要求可能派生自部署应用程序的平台、它必须发送和接收消息的传输,或者确保充分可用性所需的进程回收类型和其他进程管理,或满足某些其他管理或可靠性要求。 下一部分提供有关托管选项的信息和指南。
托管选项
托管应用程序中的自承载
WCF 服务可以托管在任何托管应用程序中。 这是最灵活的选项,因为它需要部署最少的基础结构。 在托管应用程序代码中嵌入服务的代码,然后创建并打开一个实例 ServiceHost 以使服务可用。 有关详细信息,请参阅 如何:在托管应用程序中托管 WCF 服务。
此选项支持两种常见方案:在控制台应用程序中运行的 WCF 服务,以及基于 Windows Presentation Foundation (WPF) 或 Windows 窗体 (WinForms) 的丰富客户端应用程序。 在控制台应用程序中托管 WCF 服务通常在应用程序的开发阶段非常有用。 这使得它们易于调试,可以轻松地从中获取跟踪信息,以找出应用程序内部发生的情况,并通过将它们复制到新位置轻松移动。 此托管选项还使丰富的客户端应用程序(如 WPF 和 WinForms 应用程序)可以轻松地与外界通信。 例如,使用 WPF 作为其用户界面的对等协作客户端,还托管一个 WCF 服务,该服务允许其他客户端连接到该客户端并共享信息。
托管的 Windows 服务
此托管选项包括将托管 WCF 服务的应用程序域 (AppDomain) 注册为托管 Windows 服务(以前称为 NT 服务),以便服务的生命周期由 Windows 服务控制管理器 (SCM) 管理。 与自承载选项一样,这种类型的托管环境要求将某些托管代码编写为应用程序的一部分。 通过使服务从 ServiceBase 类继承以及从 WCF 服务协定接口继承,将该服务同时实现为 Windows 服务和 WCF 服务。 然后,在重写的ServiceHost方法中创建并打开OnStart(String[])对象,并在重写的OnStop()方法中关闭。 还必须实现继承自 Installer 的安装程序类,以允许 Installutil.exe 工具将程序安装为 Windows 服务。 有关详细信息,请参阅 “如何:在托管 Windows 服务中托管 WCF 服务”。 在未激活消息的安全环境中,由托管 Windows 服务承载选项启用的方案是承载于 IIS 之外、长时间运行的 WCF 服务的方案。 服务的生命周期由操作系统控制。 此托管选项在所有版本的 Windows 中均可用。
Internet Information Services (IIS)
IIS 托管选项与 ASP.NET 集成,并使用这些技术提供的功能,例如进程回收、空闲关闭、进程运行状况监视和基于消息的激活。 在 Windows XP 和 Windows Server 2003作系统上,这是托管必须高度可用且高度可缩放的 Web 服务应用程序的首选解决方案。 IIS 还提供客户期望的企业级服务器产品的集成可管理性。 此宿主选项要求正确配置 IIS,但不需要编写任何承载代码作为应用程序的一部分。 有关如何为 WCF 服务配置 IIS 托管的详细信息,请参阅 如何:在 IIS 中托管 WCF 服务。
IIS 承载的服务只能使用 HTTP 传输。 它在 IIS 5.1 中的实现在 Windows XP 中引入了一些限制。 Windows XP 上的 IIS 5.1 为 WCF 服务提供的基于消息的激活阻止同一台计算机上的任何其他自承载 WCF 服务使用端口 80 进行通信。 在 Windows Server 2003 上由 IIS 6.0 托管时,WCF 服务可以在与其他应用程序相同的 AppDomain/应用程序池/辅助进程中运行。 但由于 WCF 和 IIS 6.0 都使用内核模式 HTTP 堆栈(HTTP.sys),因此 IIS 6.0 可与同一台计算机上运行的其他自承载 WCF 服务共享端口 80,这与 IIS 5.1 不同。
Windows 进程激活服务 (WAS)
Windows 进程激活服务(WAS)是 Windows Server 2008 的新进程激活机制,也可用于 Windows Vista。 它保留熟悉的 IIS 6.0 进程模型(应用程序池和基于消息的进程激活)和托管功能(如快速故障保护、运行状况监视和回收),但它从激活体系结构中删除了对 HTTP 的依赖。 IIS 7.0 使用 WAS 通过 HTTP 完成基于消息的激活。 其他 WCF 组件也可以集成到 WAS 中,从而通过 WCF 支持的其他协议(例如 TCP、MSMQ 和命名管道)实现基于消息的激活。 这允许使用通信协议的应用程序使用 IIS 功能,例如进程回收、快速故障保护以及仅适用于基于 HTTP 的应用程序的通用配置系统。
此托管选项要求正确配置 WAS,但不需要将任何托管代码编写为应用程序的一部分。 有关如何配置 WAS 托管的详细信息,请参阅 如何:在 WAS 中托管 WCF 服务。
选择托管环境
下表总结了与每个托管选项关联的一些关键优势和方案。
宿主环境 | 常见方案 | 主要优点和限制 |
---|---|---|
托管应用程序(“自承载”) | - 开发期间使用的控制台应用程序。 - 丰富的 WinForm 和 WPF 客户端应用程序访问服务。 |
-灵活。 - 易于部署。 - 不是服务的企业解决方案。 |
Windows 服务(以前称为 NT 服务) | - 托管在 IIS 外、长时间运行的 WCF 服务。 | - 服务进程的生命周期由操作系统控制,而不是通过消息进行激活。 - 受所有版本的 Windows 支持。 - 安全环境。 |
IIS 5.1、IIS 6.0 | - 使用 HTTP 协议与 Internet 上的 ASP.NET 内容并行运行 WCF 服务。 | - 进程回收。 - 空闲关闭。 - 进程状况监视。 - 基于消息的激活。 - 仅限 HTTP。 |
Windows 进程激活服务 (WAS) | - 在 Internet 上运行 WCF 服务,无需安装 IIS,并且可以使用多种传输协议。 | - 不需要 IIS。 - 进程回收。 - 空闲关闭。 - 进程状况监视。 - 基于消息的激活。 - 适用于 HTTP、TCP、命名管道和 MSMQ。 |
IIS 7.0 | - 运行包含 ASP.NET 内容的 WCF 服务。 - 使用各种传输协议在 Internet 上运行 WCF 服务。 |
- WAS 的优点。 - 与 ASP.NET 和 IIS 内容集成。 |
托管环境的选择取决于部署它的 Windows 版本、发送消息所需的传输以及它所需的进程和应用程序域回收的类型。 下表汇总了与这些要求相关的数据。
宿主环境 | 平台可用性 | 支持的传输 | 进程和 AppDomain 回收 |
---|---|---|---|
托管应用程序(“自承载”) | Windows XP、Windows Server 2003、Windows Vista、 Windows Server 2008 |
HTTP、 net.tcp; net.pipe; net.msmq |
否 |
Windows 服务(以前称为 NT 服务) | Windows XP、Windows Server 2003、Windows Vista、 Windows Server 2008 |
HTTP、 net.tcp; net.pipe; net.msmq |
否 |
IIS 5.1 | Windows XP | HTTP | 是的 |
IIS 6.0 | Windows Server 2003 | HTTP | 是的 |
Windows 进程激活服务 (WAS) | Windows Vista、Windows Server 2008 | HTTP、 net.tcp; net.pipe; net.msmq |
是的 |
请务必注意,从不受信任的主机运行服务或任何扩展会危及安全性。 另外,通过模拟打开 ServiceHost 时,应用程序必须确保未注销用户,例如通过缓存用户的 WindowsIdentity。