在上面一篇文章中,我们对不同版本的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;
<!--CRLF-->
2:
<!--CRLF-->
3: namespace Artech.WasHostingDemo.Contracts
<!--CRLF-->
4: {
<!--CRLF-->
5: [ServiceContract(Namespace="http://www.artech.com/")]
<!--CRLF-->
6: public interface ICalculator
<!--CRLF-->
7: {
<!--CRLF-->
8: [OperationContract]
<!--CRLF-->
9: double Add(double x, double y);
<!--CRLF-->
0: }
<!--CRLF-->
1: }
<!--CRLF-->
在Services项目中,实现了ICalculator接口,提供服务的实现:
1: using Artech.WasHostingDemo.Contracts;
<!--CRLF-->
2:
<!--CRLF-->
3: namespace Artech.WasHostingDemo.Services
<!--CRLF-->
4: {
<!--CRLF-->
5: public class CalculatorService:ICalculator
<!--CRLF-->
6: {
<!--CRLF-->
7: #region ICalculator Members
<!--CRLF-->
8:
<!--CRLF-->
9: public double Add(double x, double y)
<!--CRLF-->
0: {
<!--CRLF-->
1: return x + y;
<!--CRLF-->
2: }
<!--CRLF-->
3:
<!--CRLF-->
4: #endregion
<!--CRLF-->
5: }
<!--CRLF-->
6: }
<!--CRLF-->
和普通基于HTTP的IIS服务寄宿一样,我们需要为WCF服务创建相应的.SVC文本文件,该文件一般仅仅包含一个<%@ ServiceHost%>指令。简单起见,我仅仅添加了唯一一个必需的Service属性(Attribute)。我把该文件命名为CalculatorService.svc,下面是该.SVC的全部内容:
<%@ ServiceHost Service="Artech.WasHostingDemo.Services.CalculatorService,Artech.WasHostingDemo.Services"%>
<!--CRLF-->
然后,将Services所在的目录映射为IIS下的虚拟目录。在本例中,在IIS 7的Default Web Site站点下,创建了一个命名为WasHostingDemo的Web应用,并将其物理地址指定为Services项目所在的目录。然后在根目录下创建一个Web.config,配置WCF服务寄宿相关的设置。整个WCF配置如下,Binding类型指定为NetTcpBinding。
1: <?xml version="1.0" encoding="utf-8" ?>
<!--CRLF-->
2: <configuration>
<!--CRLF-->
3: <system.serviceModel>
<!--CRLF-->
4: <services>
<!--CRLF-->
5: <service name="Artech.WasHostingDemo.Services.CalculatorService">
<!--CRLF-->
6: <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
<!--CRLF-->
7: contract="Artech.WasHostingDemo.Contracts.ICalculator" />
<!--CRLF-->
8: </service>
<!--CRLF-->
9: </services>
<!--CRLF-->
0: </system.serviceModel>
<!--CRLF-->
1: </configuration>
<!--CRLF-->
注:由于ASP.NET应用在运行的时候默认从根目录下的Bin子目录加载Assembly,而Services项目默认编译的目标目录为Bin\Debug|Release,所以我们需要通过修改项目属性将编译的目标目录设为Bin。
步骤二:为站点设置TCP绑定,为Web应用添加支持协议
进行非HTTP的服务寄宿是WAS为WCF提供的最显著的特性。由于在默认的情况下,IIS仅仅支持对于HTTP请求的处理,我们需要相应的方式对IIS相关配置进行相关的修改,从而改变IIS默认的请求处理行为。在上面我们说过,IIS 7.0广泛采用了基于XML文件的配置方式,所以最终极的方式就是直接修改相应的配置文件。但是,直接修改配置文件的方式,出错的频率很高,对于很多的配置,我们都可以直接通过IIS管理器进行相应的修改。此外,我们可以选择通过命令行的方式修改相应的配置,IIS为我们提供了一系列的命令。
WAS的配置保存在配置文件applicationHost.config中,该文件保存在%windir%\system32\inetsrv\config目录中。为了实现基于非HTTP的服务寄宿,首先需要做的是为WCF Service的寄宿应用所在的Web Site添加非相应非HTTP协议的站点绑定(site binding),该操作可以通过执行Appcmd.exe命名实现,该命名存放在%windir%\system32\inetsrv\目录中。
为了使寄宿WCF服务的Web站点具有基于TCP的监听能力,我们可以通过下面的命名行为该站点(Default Web Site)添加基于TCP的绑定,指定监听端口为808(默认端口)。
appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']
<!--CRLF-->
站点绑定添加于修改也可以直接通过IIS管理器进行:选择相应站点=〉在右边的部分“Bindings”=〉在弹出的Site Bindings对话框中可以添加新的站点绑定和编辑现有的站点绑定,如图3所示。
图3 通过IIS管理器设置站点绑定
在站点级别非HTTP绑定存在的情况下,你还可在应用级别控制对非HTTP协议的支持。在默认的情况下,Web应用并不提供对非HTTP协议的支持,你需要通过AppCmd.exe为应用添加对于某个非HTTP协议支持的能力。通过下面的配置对默认站点下的WasHostingDemo应用添加了对net.tcp支持的能力。
appcmd.exe set app "Default Web Site/WasHostingDemo" /enabledProtocols:net.tcp
<!--CRLF-->
步骤三:创建客户端程序进行服务调用
对于调用非HTTP协议的IIS寄宿服务的客户端来说,和普通的WCF服务调用完全一样,下面是服务调用代码和相关的配置。由于,客户端程序通过访问WCF服务的.SVC文件的方式进行服务的调用,所以在相应终结点中的地址为.SVC所在的地址。
1: using System;
<!--CRLF-->
2: using System.ServiceModel;
<!--CRLF-->
3: using Artech.WasHostingDemo.Contracts;
<!--CRLF-->
4:
<!--CRLF-->
5: namespace Artech.WasHostingDemo.Client
<!--CRLF-->
6: {
<!--CRLF-->
7: class Program
<!--CRLF-->
8: {
<!--CRLF-->
9: static void Main(string[] args)
<!--CRLF-->
0: {
<!--CRLF-->
1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice"))
<!--CRLF-->
2: {
<!--CRLF-->
3: ICalculator calculator = channelFactory.CreateChannel();
<!--CRLF-->
4: using (calculator as IDisposable)
<!--CRLF-->
5: {
<!--CRLF-->
6: try
<!--CRLF-->
7: {
<!--CRLF-->
8: Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2));
<!--CRLF-->
9: }
<!--CRLF-->
0: catch (CommunicationException)
<!--CRLF-->
1: {
<!--CRLF-->
2: (calculator as ICommunicationObject).Abort();
<!--CRLF-->
3: throw;
<!--CRLF-->
4: }
<!--CRLF-->
5: catch (TimeoutException)
<!--CRLF-->
6: {
<!--CRLF-->
7: (calculator as ICommunicationObject).Abort();
<!--CRLF-->
8: throw;
<!--CRLF-->
9: }
<!--CRLF-->
0: }
<!--CRLF-->
1: }
<!--CRLF-->
2: }
<!--CRLF-->
3: }
<!--CRLF-->
4: }
<!--CRLF-->
1: <?xml version="1.0" encoding="utf-8" ?>
<!--CRLF-->
2: <configuration>
<!--CRLF-->
3: <system.serviceModel>
<!--CRLF-->
4: <client>
<!--CRLF-->
5: <endpoint address="net.tcp://127.0.0.1/WasHostingDemo/CalculatorService.svc"
<!--CRLF-->
6: binding="netTcpBinding" bindingConfiguration="" contract="Artech.WasHostingDemo.Contracts.ICalculator"
<!--CRLF-->
7: name="calculatorservice" />
<!--CRLF-->
8: </client>
<!--CRLF-->
9: </system.serviceModel>
<!--CRLF-->
10: </configuration>
<!--CRLF-->
通过运行客户端程序,你将得到如下的输出:
1: x + y = 3 when x = 1 and y = 2
<!--CRLF-->
注:部分内容节选自《WCF技术剖析(卷1)》第八章:客户端(Clients)
分享到:
相关推荐
**WCF之旅源代码——IIS寄宿与泛型序列化** Windows Communication Foundation(WCF)是微软.NET框架中用于构建分布式应用程序的服务模型。在这个源代码包中,我们聚焦于两个核心概念:IIS(Internet Information ...
本个程序,是编写WCF的两种寄宿,第一种是自身寄宿,第二种是IIS寄宿。 在运行 自身寄宿的时候,先运行 Hosting, 在运行 Client。 其二是 IIS寄宿,首先 IISService ,这是一个配置后的,服务,可以吧 IISService...
1. **服务导向架构(SOA)基础**:WCF设计的核心理念是基于服务导向架构,它允许不同的系统通过定义良好的接口进行交互。理解SOA的基本原则对于有效利用WCF至关重要。 2. **服务契约**:在WCF中,服务契约定义了...
WCF(Windows Communication Foundation)是.NET框架中用于构建和部署服务的一种技术,它允许服务通过多种协议(如HTTP、TCP等)进行通信。在开发过程中,通常使用Visual Studio(如VS2008)内置的WCFSVCHost来快速...
通过创建一个WinForms应用,开发者可以设计用户界面,并利用该界面与后台的WCF服务进行交互,获取或发送数据。 以下是WCF服务寄宿在Windows服务中的基本步骤: 1. **创建WCF服务**:首先,定义服务接口和服务实现...
**Windows Communication Foundation (WCF) 技术剖析** Windows Communication Foundation(WCF)是微软.NET框架下的一种全面的、统一的编程模型,用于构建服务导向的应用程序。它为开发人员提供了一种创建、配置、...
**WCF(Windows Communication Foundation)**是微软.NET框架下的一种面向服务的通信技术,它提供了一种统一的方式来构建分布式应用程序,使得服务可以在多种传输协议、消息格式和绑定方式下进行通信。WCF允许开发者...
**WCF技术剖析** Windows Communication Foundation(WCF)是微软.NET框架中的一种全面的服务托管和通信框架,旨在为开发人员提供构建分布式应用程序的强大工具。它整合了.NET框架中原本分散的若干通信技术,如ASP...
### 发布WCF服务到IIS的详细步骤与配置 #### 标题解析 - **发布WCF服务到IIS**:此标题明确指出本文的主要目的是介绍如何将Windows Communication Foundation (WCF)服务部署到Internet Information Services (IIS)...
在这个“WCF部署IIS示例源码”中,我们将探讨如何将WCF服务部署到IIS(Internet Information Services)上,以及这两种服务类型的区别。 首先,让我们理解一下WCF服务的两种基本类型: 1. 自定义服务:自定义服务...
Windows Communication Foundation (WCF) 是微软.NET Framework中的一种技术,用于构建高度可配置、安全和可靠的服务。它提供了一种统一的编程模型,使得开发人员可以构建面向服务的应用程序,这些应用程序能够跨越...
**部署WCF服务到IIS的基本步骤** 在Windows Communication Foundation(WCF)中,将服务部署到Internet Information Services(IIS)是常见的操作,这使得服务可以被远程客户端访问。以下是一个详细的步骤指南: 1...
- 服务托管:IIS、自承载和Windows服务三种托管方式的比较与选择。 - 消息交换模式:了解请求/响应、单向、双工等多种消息交换模式。 2. **WCF服务契约**: - 数据契约:定义数据结构并实现跨进程的数据传输。 ...
**WCF基础实例——寄宿IIS** Windows Communication Foundation(WCF)是.NET框架中用于构建分布式应用程序的服务模型。它提供了一种统一的方式来创建、发布和消费服务,这些服务可以跨各种传输协议和网络进行通信...
1. .NET Framework:WCF服务基于.NET Framework运行,因此需要确保系统中安装了相应版本。 2. IIS:确保IIS已安装并配置好,可以在控制面板的“程序和功能”中启用或添加IIS功能。 3. WCF服务开发工具:Visual ...
在本例中,我们将WCF服务寄宿在WinForm应用中,而不是常见的IIS(Internet Information Services)或其他后台服务。这样做的好处是可以更紧密地集成服务与用户界面,方便进行调试和测试。 **寄宿在WinForm中的步骤*...
本文将详细介绍如何在Windows服务中寄宿WCF服务,以实现后台运行的服务通信。 首先,理解WCF的基本概念是必要的。WCF提供了一种统一的编程模型,用于创建网络服务,它支持多种协议,如HTTP、TCP、命名管道等,以及...
综上所述,《WCF技术剖析(卷1)》不仅涵盖了WCF的基本概念和技术细节,还深入分析了其背后的原理和最佳实践,是学习和掌握WCF技术不可或缺的资源。无论是初学者还是有经验的开发者,都能从中获得宝贵的知识和启示,...
《WCF技术剖析》从WCF的终结点谈起,对终结点的三要素进行了全面而深入的介绍,帮助读者了解地址、绑定和契约的本质。 通过本书对序列化的深入讲解,读者可了解WCF进行操作方法调用与消息之间转化的本质;深入剖析...