在这篇文章中,将会包括:
对于构建WCF服务来说,服务的寄宿和配置是非常重要的,特别是在服务部署阶段。在开发人员完成服务开发之后,我们需要部署服务以便提供给所有客户端消费者使用。在现实环境中,有各种服务部署方案可供选择,这将导致在服务配置或寄宿环境中不同的部署和配置要求。
作为一个增强的服务开发平台,WCF在服务寄宿和配置上提供了丰富的内置的支持,能够满足大部分已经存在的部署需求和要求。例如,最流行的IIS寄宿方式可以为本地局域网或基于公网部署的情况提供高可用性和稳定的服务。Windows服务寄宿方式使得WCF服务寄宿更容易和现有的后台计划任务集成,并且自寄宿的方式在生产环境中提供最灵活的服务部署和定制点。
在这一章中,我们将着眼于各种WCF托管和配置方案的7个食谱。食谱开始于4个典型的寄宿案例——自寄宿,Windows服务寄宿,基于IIS的HTTP寄宿和基于IIS的非HTTP寄宿。接下来是两个定制服务寄宿案例——包括一个自定义ServiceHostFactory和一个专用单例寄宿。最后演示一个更高级的WCF服务寄宿场景——Windows SharePoint服务寄宿。
当在.NET框架下建立一个简单的演示程序时,通常选择一个控制台应用程序。同样,当讨论WCF服务寄宿是,控制台寄宿方案是最方便的一种,当我们想做一些快速演示或者测试一些WCF功能时,控制台是特别方便并且有用的。
static void Main(string[] args) { using (ServiceHost consoleHost = new ServiceHost(typeof(TestService))) { consoleHost.Open(); Console.WriteLine("press any key to stop service host..."); Console.ReadLine(); } }
当在Visual Studio中添加一个新的WCF服务项,IDE其实帮你完成了下面3件事:
[ServiceContract] public interface ITestService { [OperationContract] void DoWork(); } public class TestService : ITestService { public void DoWork() { } }
除了契约和服务类型之外,IDE将插入一个默认的可以通过服务暴露终结点的配置设置。下面的截图展示了包含一个使用WSHttpBinding的单一终结点示例服务配置节。
用先前定义的代码和配置项,我们可以通过在ServiceHost类的构造函数中提供的服务类型来启动服务宿主。
using (ServiceHost consoleHost = new ServiceHost(typeof(TestService)))
运行时将会检查配置文件,并加载与构造函数中具有相同名称的指定类型的<service>项,然后启动已定义的服务和终结点。
Windows服务被广泛应用于Windows操作系统上托管的将在后台执行一些长期或预定任务的应用程序。通过Windows服务寄宿的应用程序可以在一个特定的用户账户下运行,并能选择启动模式(手动或自动)。作为一个流行的服务-应用程序-寄宿场景,也是相当普遍的方式来部署WCF服务作为一个Windows服务。
在这个食谱中,我们使用一个典型的基于.NET的Windows服务来演示如何在一个Windows服务应用程序中寄宿WCF服务。通过具体的步骤来看看:
public partial class Service1 : ServiceBase { ServiceHost _svcHost = null; protected override void OnStart(string[] args) { // Start the service host here _svcHost = new ServiceHost(typeof(TestService)); _svcHost.Open(); } protected override void OnStop() { // Close the service host _svcHost.Close(); } }
下面的语句展示了使用Installutil.exe工具安装和卸载一个基于.NET的Windows Service应用程序的完整命令。
安装Windows Service:
InstallUtil.exe WCFNTService.exe
卸载Windows Service:
Install Util.exe /u WCFNTService.exe
上面提及的WCFNTService.exe是示例Windows Service项目的生成的编译名。
当Windows Service启动的时候会触发OnStart事件,而Windows Service关闭时则触发OnStop事件。因此,它们是我们把寄宿WCF服务代码最好的地方。
有时,我们可能需要访问一些远程或受保护的Windows Service寄宿程序的资源,在这种情况下,最重要的是要指定一个特有的服务账户,而这可以在开发时指定也可在Windows Service配置管理器中指定。下图展示的服务列表中,就包含了在Windows Service配置管理器中已经安装的Windows Service示例。
ASP.NET为开发基于.NET框架的web应用程序提供一个强大的平台。ASP.NET web应用程序也是为应用了web HTTP协议的WCF服务提供了固有的寄宿环境,这意味着开发人员可以部署WCF服务时,可以与ASP.NET网页一起部署在相同的Web应用程序中而不需要任何特别的配置。
然而,默认情况下,一些ASP.NET运行时特性或状态对象不适用于WCF服务代码,虽然他们是在相同的web应用程序中。限制特性包括:
那么,怎么才能使这些特性也适用于WCF服务呢?答案就是,WCF服务寄宿基础架构已经提供了调用ASP.NET的兼容模型,它可以帮助解决这些问题。这个特性默认是不可用的,在这个部分,我们将演示如何使用这个特性,以便WCF服务可以继续享用ASP.NET运行时。
[ServiceContract] public interface IEchoService { [OperationContract] string Echo(); }
using System.ServiceModel.Activation; [AspNetCompatibilityRequirements( RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed )] public class EchoService : IEchoService { … }
public class EchoService : IEchoService { public string Echo() { var approot = HttpContext.Current.Server.MapPath("~/"); var data = HttpContext.Current.Cache["key1"]; var url = HttpContext.Current.Request.RawUrl; return string.Format("{0}, {1}, {2}", approot, data, url); } }通过在WCF客户端测试工具上执行一个快速测试,我们可以得到预期的所有返回ASP.NET上下文属性的相应,如下图所示:
WCF HTTP服务寄宿在ASP.NET web应用程序中可以运行在两种不同的模式中——默认模式和ASP.NET兼容模式。
在默认模式中,ASP.NET运行时可以在请求管道的早期拦截WCF请求:BeginRequest (ASP.NET HttpModule的其中一个拦截点),因此大部分ASP.NET运行时信息不适用于WCF服务代码。当启用了ASP.NET兼容模式,WCF服务运行时通过用于HTTP传输的模块和处理程序挂接到ASP.NET HTTP管道,这样那些ASP.NET特定的上下文数据就又可以用了。
关于更多用于WCF服务寄宿的ASP.NET兼容模式详细信息,可以参考Wenlong Dong的博客:
ASP.NET Compatibility Mode :http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx