项目需求
之前的项目中采用了WCF,绑定模式选择的是netTcpBinding,宿主选择了控制台方式,主要考虑两方面优点:- 方便管理宿主的生命周期
- 提升服务性能
- 调试项目时必须先启动控制台才能提供服务
- 远程部署后,系统一旦注销就无法正常提供服务
- 控制台中的异常导致服务实例一旦崩溃无法及时启动新的实例提供服务
IIS6.0体系简析
关于WCF寄宿到IIS上的问题,MSDN上有一篇文章说的很详细:http://msdn.microsoft.com/zh-cn/magazine/cc163357.aspx 使用 WAS 扩展 HTTP 之外的 WCF 服务
这里仅做简要介绍:
IIS 6.0的体系有两个基本组成部分,侦听器和工作进程:
![imagewcf服务编程,WCF服务重构实录(上)](/Files/20114/89ccdf84-a4c7-4c42-ab8b-97c87dd3bd60.png)
侦听器进程由w3svc 服务实现,负责监控主机接收到的请求,根据绑定配置将请求递交给响应的处理程序的进程中,如对aspx文件的请求会递交给aspnet_isapi.dll来处理
![imageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/511b9530-5fb4-44f9-8329-fc3a1ddca965.png)
工作进程是一种轻型可执行文件。当它开始对一个激活请求做出响应时,首先会加载一个简单的非托管填充程序 DLL (w3wphost.dll) 来支持 w3svc 与工作进程通信。该填充程序还负责加载 aspnet_isapi.dll,该文件会实现 ASP.NET 的托管组件和 IIS 的非托管组件之间的接口。之后便可以正常对请求方输出响应的数据了。
IIS7.0对WCF的支持
先看看这个图吧,![imageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/c132bd72-4fbc-40fa-aea8-6e823ac1b9c6.gif)
在 IIS 6.0 中,w3svc 服务实际上承担着双重任务。它在 http.sys 中注册,并且是传入的 HTTP 通信的直接接收者,因此它充当 HTTP 侦听器。同时,它还拥有进程激活组件,负责正确启动 w3wp 的新实例以及分派请求。在 IIS 7.0 中,这两种责任被重构给了不同的 Windows NT 服务。w3svc 进程保留了其作为 HTTP 侦听器的角色,但负责配置和进程激活的组件被作为因子之一计入 WAS,WAS 包括三个部分:配置管理器、进程管理器、非托管侦听器适配器接口。
我们这边使用到的正是TCP侦听,如果想在IIS7中支持TCP通信,我们需要配置几项
WCF Activation
![imageimageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/6290a519-8934-45df-8c4f-98649d8b4cc0.png)
windows 进程激活服务
![imageimageimageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/bb8f5e82-ab4b-4646-bb9e-530460f87e0a.png)
在IIS7中呢也需要进行配置tcp支持,首先确保IIS7开启后安装了.NET4.0的框架支持
再配置网站的绑定,增加nettcp
![imageimageimageimageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/178325ca-c3df-4b4a-acbe-d3406208194a.png)
在高级设置中需要增加nettcp
![imageimageimageimageimageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/cf2fd0c7-8ee6-4b4c-aefa-09e2926d417d.png)
好,配置到这里呢,IIS7已经可以支持TCP通信了,那么我们先来看Demo的代码结构。
WCF服务Host在控制台的项目
这个Demo的解决方案包括了一个控制台宿主和WCF的类库![imageimageimageimageimageimageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/3154b8e6-cf88-41a9-908b-063398fe2ef9.png)
服务很简单,提供一个加操作服务:
public class Add:IAdd { public int GetResult(int numberA, int numberB) { return numberA + numberB; } }
那么Host中的代码也很简单,启动服务
static void Main(string[] args) { var host = new System.ServiceModel.ServiceHost(typeof(WCFLib.Add)); host.Open(); Console.WriteLine("service opened.."); Console.Read(); }
配置文件指定了服务的地址和终结点信息:
好,一个服务开发完成,可以正常运行了,下节将会对如何将这个HOST转到IIS上做介绍
![imageimageimageimageimageimageimageimagewcf服务编程,WCF服务重构实录(上)](/Files/20114/4dc0f7e9-f264-47be-8692-b41ad5acb92f.png)
文章索引:WCF服务重构实录(上) WCF服务重构实录(中)
Demo文件下载:http://files.cnblogs.com/wengyuli/WCFHostChange.rar
最新评论