[原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
2009-06-21 22:12
1301 查看
在上面一篇文章中,我们对不同版本的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。
在Services项目中,实现了ICalculator接口,提供服务的实现:
和普通基于HTTP的IIS服务寄宿一样,我们需要为WCF服务创建相应的.SVC文本文件,该文件一般仅仅包含一个<%@ ServiceHost%>指令。简单起见,我仅仅添加了唯一一个必需的Service属性(Attribute)。我把该文件命名为CalculatorService.svc,下面是该.SVC的全部内容:
然后,将Services所在的目录映射为IIS下的虚拟目录。在本例中,在IIS 7的Default Web Site站点下,创建了一个命名为WasHostingDemo的Web应用,并将其物理地址指定为Services项目所在的目录。然后在根目录下创建一个Web.config,配置WCF服务寄宿相关的设置。整个WCF配置如下,Binding类型指定为NetTcpBinding。
通过运行客户端程序,你将得到如下的输出:
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。
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="" <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint address="net.tcp://127.0.0.1/WasHostingDemo/CalculatorService.svc" binding="netTcpBinding" bindingConfiguration="" contract="Artech.WasHostingDemo.Contracts.ICalculator" name="calculatorservice" /> </client> </system.serviceModel> </configuration>
通过运行客户端程序,你将得到如下的输出:
x + y = 3 when x = 1 and y = 2
相关文章推荐
- [原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
- WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
- WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
- [转载]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
- [原创]WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- [原创] WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- [原创]WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- [原创]WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[第2篇]
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- [原创] WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
- 【转】WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- [原创]WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[第1篇]