托管服务

要变为活动状态,服务必须承载于创建它并控制它的上下文和生存期的运行时环境中。 Windows Communication Foundation (WCF) 服务设计为在支持托管代码的任何 Windows 进程中运行。

WCF 提供了统一编程模型,用于生成面向服务的应用程序。 此编程模型保持一致且独立于部署服务的运行时环境。 实际上,这意味着不管使用什么宿主选项,服务的代码看起来都非常类似。

这些宿主选项的范围是从在控制台应用程序内运行到在服务器环境(如在由 Internet 信息服务 (IIS) 或由 Windows 进程激活服务 (WAS) 管理的工作进程内运行的 Windows 服务)中运行。 开发人员选择可满足服务的部署要求的宿主环境。 这些要求可能源自部署应用程序的平台,它必须发送和接收消息的传输,或者进程回收的类型和为确保足够可用性所需的其他进程管理,或者某些其他管理或可靠性要求。 下一节提供了有关宿主选项的信息和指南。

托管选项

托管应用程序中的自承载

WCF 服务可以承载于任何托管应用程序中。 这是最灵活的选项,因为它需要部署最少的基础结构。 在托管应用程序代码内嵌入服务代码,然后创建并打开 ServiceHost 的实例以使服务变为可用。 有关详细信息,请参阅如何:在托管应用程序中托管 WCF 服务

此选项启用两个常见方案:在控制台应用程序内运行的 WCF 服务;以及丰富客户端应用程序,如基于 Windows Presentation Foundation (WPF) 或 Windows 窗体 (WinForms) 的应用程序。 在应用程序的开发阶段中,将 WCF 服务承载于控制台应用程序内通常是很有用的。 这使服务变得容易调试,从中跟踪信息以查明应用程序内发生的情况变得更加方便,以及通过将其复制到新的位置进行来回移动变得更加轻松。 此承载选项还使丰富客户端应用程序(如 WPF 和 WinForms 应用程序)与外部世界的通信变得很容易。 例如,一个将 WPF 用于其用户界面并托管一个允许其他客户端连接到它并共享信息的 WCF 服务的对等协作客户端。

托管 Windows 服务

此承载选项包括注册应用程序域 (AppDomain),该域托管作为托管 Windows 服务(以前称为 NT 服务)的 WCF 服务,以便服务的进程生存期由 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 Vista 上也可用的 Windows Server 2008 的新进程激活机制。 它保留了熟悉的 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 - 运行 WCF 服务与 ASP.NET 内容。
- 使用各种传输协议在 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

另请参阅