微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WCF服务重构实录上

http://wengyuli.blog.51cto.com/44136/583895

项目需求

之前的项目中采用了WCF,绑定模式选择的是netTcpBinding,宿主选择了控制台方式,主要考虑两方面优点:

  • 方便管理宿主的生命周期
  • 提升服务性能

但是在实际的开发过程中产生了许多问题,比如:

  • 调试项目时必须先启动控制台才能提供服务
  • 远程部署后,系统一旦注销就无法正常提供服务
  • 控制台中的异常导致服务实例一旦崩溃无法及时启动新的实例提供服务

在经历了几个月的实践之后,我们决定改造WCF服务,宿主改成IIS,这样可以及时处理服务进程崩溃无法产生新服务进程的问题,我做了个Demo来尝试重构宿主。

IIS6.0体系简析

关于WCF寄宿到IIS上的问题,MSDN上有一篇文章说的很详细:

http://msdn.microsoft.com/zh-cn/magazine/cc163357.aspx 使用 WAS 扩展 HTTP 之外的 WCF 服务

这里仅做简要介绍:

IIS 6.0的体系有两个基本组成部分,侦听器和工作进程: 

 

侦听器进程由w3svc 服务实现,负责监控主机接收到的请求,根据绑定配置将请求递交给响应的处理程序的进程中,如对aspx文件的请求会递交给aspnet_isapi.dll来处理 

 

工作进程是一种轻型可执行文件。当它开始对一个激活请求做出响应时,首先会加载一个简单的非托管填充程序 DLL (w3wphost.dll) 来支持 w3svc 与工作进程通信。该填充程序还负责加载 aspnet_isapi.dll,该文件会实现 ASP.NET 的托管组件和 IIS 的非托管组件之间的接口。之后便可以正常对请求方输出响应的数据了。

IIS7.0对WCF的支持

先看看这个图吧,

在 IIS 6.0 中,w3svc 服务实际上承担着双重任务。它在 http.sys 中注册,并且是传入的 HTTP 通信的直接接收者,因此它充当 HTTP 侦听器。同时,它还拥有进程激活组件,负责正确启动 w3wp 的新实例以及分派请求。在 IIS 7.0 中,这两种责任被重构给了不同的 Windows NT 服务。w3svc 进程保留了其作为 HTTP 侦听器的角色,但负责配置和进程激活的组件被作为因子之一计入 WAS,WAS 包括三个部分:配置管理器、进程管理器、非托管侦听器适配器接口。

我们这边使用到的正是TCP侦听,如果想在IIS7中支持TCP通信,我们需要配置几项

WCF Activation 

 windows 进程激活服务 

 在IIS7中呢也需要进行配置tcp支持,首先确保IIS7开启后安装了.NET4.0的框架支持

再配置网站的绑定,增加nettcp,认端口是808,如果您要寄宿一个供Silverlight访问的服务最好设置为4502或者45**,与策略文件相对应

 

 在高级设置中需要增加nettcp

 

好,配置到这里呢,IIS7已经可以支持TCP通信了,那么我们先来看Demo的代码结构。

WCF服务Host在控制台的项目

这个Demo的解决方包括一个控制台宿主和WCF的类库 

 

服务很简单,提供一个加操作服务:

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(); }

配置文件指定了服务的地址和终结点信息:

 

<system.servicemodel>
    bindings>
      nettcpbinding        binding name="netTcpBindConfig"          security mode"None"            transport protectionlevel"EncryptAndSign" clientcredentialtype"Windows"message </message></transportsecuritybindingservicesservice "WCFLib.Add" behaviorconfiguration"MyBehavior"endpoint bindingconfiguration"netTcpBindConfig" contract"WCFLib.IAdd" binding"netTcpBinding"address"net.tcp://localhost:4503/Add"endpoint"IMetadataExchange" "mexTcpBinding" tcp://localhost:4504/Add/mex"servicebehaviorsservicebehaviorsbehavior servicethrottling maxconcurrentsessions"1000" maxconcurrentinstancesmaxconcurrentcalls"1000"serviceMetadataservicedebug includeexceptiondetailinfaults"true"datacontractserializer maxitemsinobjectgraph"6553600"datacontractserializerservicedebugservicethrottlingbehavior  >
 

好,一个服务开发完成,可以正常运行了,下节将会对如何将这个HOST转到IIS上做介绍

 

文章索引:WCF服务重构实录(上)  WCF服务重构实录(中)

Demo文件下载:http://files.cnblogs.com/wengyuli/WCFHostChange.rar

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐