在 Windows 服务中承载 WCF 服务是一种合理的选择。不应将 Windows 服务与 WCF 服务混为一谈。它们都使用“服务”一词,但却具有不同的含义。Windows 服务是由操作系统管理的进程。Windows 提供了服务控制管理器,用于控制操作系统上安装的服务。Windows 通过服务来支持诸如网络、USB、远程访问、消息队列等操作系统功能。您可以使用 Visual Studio 2005,利用 Windows 服务项目模板(如图 5-2 所示)创建 Windows 服务。
图 5-2:Visual Studio 2005 Windows 服务项目模板
Windows 服务项目模板会生成一个项目,其中包含两个文件:service1.cs 文件和 program.cs 文件。其中 service1.cs 文件包含服务实现,而 program.cs 文件则用于实例化并实质上承载 Windows 服务。要在 Windows 服务内部承载 WCF 服务,只需执行 Windows 服务的 Start() 方法和 Stop() 方法,如列表 5-2 所示。由于启动 Windows 服务的范例与启动 WCF ServiceHost 内的服务相似,因此最后需要将 WCF 服务的生存期与 Windows 服务的生存期相连。
列表 5-2:承载 WCF ServiceHost 的 Windows 服务
using System; using System.ServiceModel; using System.ServiceProcess; using QuickReturns.StockTrading.ExchangeService;
namespace QuickReturns.StockTrading.ExchangeService.Hosts { public partial class ExchangeWindowsService : ServiceBase { ServiceHost host;
public ExchangeWindowsService() { InitializeComponent(); }
protected override void OnStart(string[] args) { Type serviceType = typeof(TradeService); host = new ServiceHost(serviceType); host.Open(); }
3、双击列表框中的应用程序文件夹将它打开,从 Windows 服务项目中选择“主输出”,然后单击“确定”。主输出将添加到自定义操作的所有四个节点中:安装、提交、回滚和卸载。
4、生成安装项目。
编译项目时,输出的是 Microsoft 安装程序文件 (.msi) ,通过该文件可以将服务安装到 Windows 服务控制管理器中。
注意 本章介绍生成 Windows 服务和 Windows 服务安装程序的基础知识。如果将 Windows 服务设置为在不受限制的 Localsystem 帐户下运行或基本合适的网络服务帐户下运行,就安全最佳方法而言,这并非最佳选择。通常,操作员能够在安装期间选择凭据,或在安装之后通过服务控制管理器管理控制台管理单元(可以通过 Windows 计算机管理进行访问)来调整安全标识设置。有关开发 Windows 服务的详细信息和最佳方法,请参阅本书第 7 章、MSDN 帮助或 .NET 开发专著。
使用 Internet 信息服务进行承载
在 IIS 上的 Web 服务开发长期以来一直是 ASP.NET 的领地。ASP.NET 1.0 发布后,Web 服务框架成为它的一部分。Microsoft 利用 ASP.NET HTTP 管道使 Web 服务在 Windows 平台上成为现实。遗憾的是,ASP.NET 和 Web 服务之间的这种紧密耦合在面向服务的世界中产生了几个限制,对 HTTP 的依赖性是主要原因。在不同宿主上运行 ASP.NET HTTP 管道很困难,因此很少采用这种方案。甚至在此后,ASP.NET Web 服务(也称为 ASMX 服务)在部署方案和配置依赖性方面一直是非常面向 Web 的。Microsoft 最初发布了几个版本的 Web 服务增强 (WSE),以弥补 ASP.NET Web 服务的某些局限,尤其是消除在实现 WS-* 协议方面的限制。但是,WSE 非常依赖于 ASP.NET Web 服务实现。
在以前几章中介绍过,WCF 服务采用了完全不同的途径来实现面向服务。WCF 的统一编程模型基于严格分层的模型,以分解面向 Web 的范例,并使服务模型和通道层与受支持的传输方式断开连接。此模型允许 WCF 支持几个不同的宿主,其中 IIS 是最重要的。
构建 WCF 是为了支持 Windows XP、Windows Server 2003、Windows Vista 和 Windows Server 2007。自从 IIS 5.1(与 Windows XP 一起发布)以来,有了很多变化。但是,Microsoft 仍然继续支持旧版上的 WCF。这可能是因为 Microsoft .NET Framework 和 CLR 提供的功能所导致的,该功能是构建 WCF 的基础。在以下几节中,将介绍不同 IIS 版本的进程模型之间的差异和 WCF 服务的结果。
using System; using System.Collections; using System.ServiceModel; using QuickReturns.StockTrading.ExchangeService.Contracts; using QuickReturns.StockTrading.ExchangeService.DataContracts;
namespace QuickReturns.StockTrading.ExchangeService { [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, IncludeExceptionDetailInFaults=true)] public class TradeServiceInline : ITradeService { public Quote GetQuote(string ticker) { ... }
使用 WCF 会话时,理解这些回收功能很重要。通常,在安全和可靠消息方案中有这种情况,本书的第 6 章和第 8 章将对此进行介绍。默认情况下,WCF 将会话状态存储在内存中。这是与 ASP.NET 会话状态不同的实现,它没有需要切换到持久会话状态存储的配置。但在安全和可靠消息方案中,您可以并且应当受益于 ASP.NET 实现。通过使用 WCF 的 ASP.NET 兼容性功能,可以获得 ASP.NET 会话状态的 SQL Server 和状态服务器实现,以支持企业可用的方案。在下一节中,将介绍如何受益于 WCF ASP.NET 兼容性模式。
ASP.NET 兼容性模型
如果在负载平衡或者甚至 Web 园的环境中承载 WCF 服务,并且在该环境中后续的会话请求可以被此环境内的不同宿主或进程处理,则需要对会话状态进行进程外持久存储。最新的 WCF 不支持会话状态的持久存储。相反,WCF 将它的所有会话状态存储在内存中。如果在 IIS 中承载 WCF 服务,最后可以使用回收方案,上一节对此进行了描述。WCF 依赖于会话状态的 ASP.NET 实现,而不是为会话全部再次建立持久存储。此方式有一个严重的限制:使服务仅限于 HTTP。
ASP.NET 会话状态不是受 ASP.NET 兼容性模式支持的唯一功能。它还支持诸如 HttpContext、globalization 和模拟等功能,就像用于 ASP.NET Web 服务 (ASMX) 一样。有关启用进程外会话状态的特定于 ASP.NET 的功能,请参考 MSDN 帮助。
若要查看 ASP.NET 兼容性模式的限制,必须用 AspNetCompatibilityRequirements 属性显式标记服务,如列表 5-9 所示。
列表 5-9:AspNetCompatibilityRequirements 属性
namespace QuickReturns.StockTrading.ExchangeService { [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ReturnUnknownExceptionsAsFaults=true)] [AspNetCompatibilityRequirements( RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] public class TradeService : ITradeService { ... } }
AspNetCompatibilityRequirementsMode 属性有以下允许值。
表 5-1. AspNetCompatibilityRequirementsMode 属性的值
值
说明
NotAllowed
指示服务可能“永远不能”运行在 ASP.NET 兼容性模式中。如果在方案中服务实现不能在 ASP.NET 兼容性模式中工作(例如,在服务不是为 HTTP 生成的方案中),则必须设置此项。
Allowed
指示服务“可能”运行在 ASP.NET 兼容性模式中。只有当您知道服务可能在此模式中工作时,才能选取此值。
注意:本书附带的示例代码包含在 ExchangeServiceInline.svc 文件中承载的 TradeService 服务,它被配置为在 ASP.NET 兼容性模式中运行。您可以在第 5 章的解决方案文件(请参考示例代码下载链接)中找到它。
Windows XP 和 IIS 5.1
Windows 2000 附带的 IIS 5.0 拆分了 IIS 进程模型,并引入了工作进程。此更改的主要原因是为了隔绝应用程序,以便 IIS 可以承载相互依赖较少的不同应用程序。IIS 5.0 与 Windows 2000 一起发布,而 IIS 5.1 与 Windows XP 一起发布。WCF 不支持在带 IIS 5.0 的 Windows 2000 上承载服务;因此,我们将只详细考查 IIS 5.1。IIS 5.1 受支持,但它有仅一个站点的限制,并且每个应用程序都运行在一个称为 aspnet_wp.exe 的工作进程中。IIS 5.1 对于开发 ASP.NET 网站和 WCF 服务是很好的版本。它不是为企业使用而准备的,因为它有连接限制,并且只运行在早期的 Windows 版本或 Windows XP 的客户端版本上。在本章中,我们将讨论 IIS 5.1。
在图 5-11 中,可以看到 IIS 5.1 的进程模型。体系结构被拆分成两部分。左侧的 W3svc.exe 承载 HTTP 侦听器、启动工作进程并管理配置。另一侧的工作进程则使 IIS 5.1 能够承载托管的 .NET 应用程序,在这里,ASPNET_ISAPI.dll 负责创建托管 .NET 应用程序域。请注意,在 Windows XP 上,W3svc.exe Windows 服务与 SMTP 和 FTP 服务一起承载在 SvcHost.exe 进程中。
图 5-11:IIS 5.1 进程模型体系结构
注意:不必有 IIS 即可运行 ASP.NET 和 WCF 服务。例如,可以使用 Visual Studio 2005 附带的 ASP.NET 开发 Web 服务器。在发布 Windows XP 时,Visual Studio 还没有此功能。必须使用 IIS 5.1 才能在 Windows XP 上开发 Web 应用程序。
此时,如果使用 Internet Explorer 浏览到http://localhost/ExchangeService位置,将能够看到一个目录列表(只要设置与上一图中相似)。如果单击 Service.svc,将转到由 *.svc 扩展的 System.ServiceModel.Activiation.HttpHandler 生成的默认帮助屏幕。
一种替代方法是直接利用 SvcUtil.exe 实用程序,而不是 Visual Studio 加载项。在从 Visual Studio 中直接执行时,Visual Studio 加载项将再次带参数调用 SvcUtil.exe 以生成代理。通过查看“输出”窗口,并在下拉列表中将“显示输出”设置为“服务引用”,可以看到命令行和该命令的结果。
在了解了有关承载的可选方案的所有内容后,您将能够构建 WCF 应用程序,并在任何需要的地方承载它们。此外,您还能够解释在最新可用环境(Windows Vista 或 Windows Server 2007 上的 IIS 7.0 与 WAS)中进行承载的好处。
作者简介
Chris Peiris 是应用程序集成方面的热心作者。他在澳大利亚的 Avanade 公司担任解决方案设计师。他经常在有关 Microsoft 技术的专业开发人员会议上发言。Chris 为包括 15Seconds、ASPToday、Wrox (Apress) 和 Developer Exchange (DevX) 在内的各种在线刊物编写了很多文章、评论和专栏。他还与他人共同编写了很多有关 WCF、Web 服务、UDDI、C#、IIS、Java 和安全方面的书籍。Chris 目前主要关注 WCF、WinFX、IBM Message Broker、BizTalk 和其他 EAI 实现。若要查看 Chris 的完整作品列表和详细联系信息,请访问http://www.chrispeiris.com/。
Dennis Mulder 于 1997 年开始他的职业生涯,专注于 Microsoft 技术。在 2004 年 8 月,他开始服务于 Avanade,这是一家 Microsoft 和 Accenture 的合资公司。目前,他主要关注 Microsoft 平台的几个领域,具体包括面向服务的领域、集成和软件工厂。作为在荷兰的顾问,Dennis 通过利用 Microsoft 平台的强大功能与企业客户共同合作解决其问题。Dennis 经常在荷兰 Microsoft 会议和用户组中发言,在 2006 年初,他就已经成为 INETA 的发言人。可以通过dennism@avanade.com或他的博客http://www.dennismulder.net/与 Dennis 联系。
Avanade 是全球 IT 咨询公司,致力于使用 Microsoft 平台帮助企业取得盈利增长。通过利用拓展 Microsoft 技术的成熟解决方案,Avanade 帮助企业增加收入、降低成本并对创新技术进行再投资,以获得竞争优势。我们的顾问通过汇聚我们全球雇员的洞察力、创新和才干,按照每个客户的要求、时间线和预算提供服务。有关其他信息,可以访问http://www.avanade.com/。