Welcome

首页 / 软件开发 / WCF / WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿

WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿2012-10-08 cnblogs Artech在上面一篇文章中,我们对不同版本的IIS,以及ASP.NET得的实现机制进行了详细而深入的分析。在介绍IIS7.0的时候,我们谈到,HTTP.SYS+W3SVC实现了基于HTTP的请求监听,在此基础上引入了以下三组网络监听器(Listener)和监听适配器(Adapter),实现了基于TCP、Named Pipes和MSMQ的网络监听,图1揭示了IIS7的总体结构。

TCPListener|TCP Listener Adapter

NamedPipes Listener|Named Pipes Listener Adapter

MSMQ Listener|MSMQ Listener Adapter

图1 IIS 7总体架构

由于IIS 7提供了基于非HTTP网络协议的监听支持,那么就意味着当我们当我们通过IIS进行WCF服务寄宿(Hosting)的时候,可以采用非HTTP的通信方式。在本篇文章中,我们将通过一个简单实例介绍进行非HTTP的IIS服务寄宿,Source Code下载WasHostingDemo.zip。

由于IIS 7在本质上通过WAS(Windows Process Activation Service)实现了非HTTP的请求监听,我们也可以将这种方式的服务寄宿称为基于WAS的服务寄宿。在本实例中,我们通过IIS 7实现基于TCP的服务寄宿,图2表示实例应用在VS2008种的解决方案结构。其中,Class Library类型的项目Contracts用于定义服务契约;而Services则用于定义具体的服务;Console应用项目Client模拟客户端。此外,Services对应目录被映射为IIS相应站点下的某个Web应用,虚拟目录名称为WasHostingDemo。

图2 基于TCP的IIS服务寄宿实例在VS2008中的解决方案结构

步骤一:定义服务契约和服务

本实例仍然采用我们熟悉的计算服务的例子,在Contracts项目下,定义了接口ICalculator代表计算服务的服务契约。

1: using System.ServiceModel;
2:
3: namespace Artech.WasHostingDemo.Contracts
4: {
5: [ServiceContract(Namespace="http://www.artech.com/")]
6:public interface ICalculator
7: {
8: [OperationContract]
9:double Add(double x, double y);
0: }
1: }
在Services项目中,实现了ICalculator接口,提供服务的实现:

1: using Artech.WasHostingDemo.Contracts;
2:
3: namespace Artech.WasHostingDemo.Services
4: {
5:public class CalculatorService:ICalculator
6: {
7: #region ICalculator Members
8:
9: public double Add(double x, double y)
0: {
1: return x + y;
2: }
3:
4: #endregion
5: }
6: }
和普通基于HTTP的IIS服务寄宿一样,我们需要为WCF服务创建相应的.SVC文本文件,该文件一般仅仅包含一个<%@ ServiceHost%>指令。简单起见,我仅仅添加了唯一一个必需的Service属性(Attribute)。我把该文件命名为CalculatorService.svc,下面是该.SVC的全部内容:

<%@ ServiceHost Service="Artech.WasHostingDemo.Services.CalculatorService,Artech.WasHostingDemo.Services"%>
然后,将Services所在的目录映射为IIS下的虚拟目录。在本例中,在IIS 7的Default Web Site站点下,创建了一个命名为WasHostingDemo的Web应用,并将其物理地址指定为Services项目所在的目录。然后在根目录下创建一个Web.config,配置WCF服务寄宿相关的设置。整个WCF配置如下,Binding类型指定为NetTcpBinding。

1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <system.serviceModel>
4: <services>
5: <service name="Artech.WasHostingDemo.Services.CalculatorService">
6: <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
7: contract="Artech.WasHostingDemo.Contracts.ICalculator" />
8: </service>
9: </services>
0: </system.serviceModel>
1: </configuration>
注:由于ASP.NET应用在运行的时候默认从根目录下的Bin子目录加载Assembly,而Services项目默认编译的目标目录为BinDebug|Release,所以我们需要通过修改项目属性将编译的目标目录设为Bin。