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 clientcredentialtype="Windows">
          </message></transport></security>
        </binding>
      </nettcpbinding>
    </bindings>
    <services>
      <service name="WCFLib.Add" behaviorconfiguration="MyBehavior">
        <endpoint bindingconfiguration="netTcpBindConfig" contract="WCFLib.IAdd" binding="netTcpBinding"address="net.tcp://localhost:4503/Add"></endpoint>
        <endpoint contract="IMetadataExchange" binding="mexTcpBinding" address="net.tcp://localhost:4504/Add/mex"></endpoint>
      </service>
    </services>
    <behaviors>
      <servicebehaviors>
        <behavior name="MyBehavior">
          <servicethrottling maxconcurrentsessions="1000" maxconcurrentinstances="1000" maxconcurrentcalls="1000">
          <servicemetadata>
          <servicedebug includeexceptiondetailinfaults="true">
          <datacontractserializer maxitemsinobjectgraph="6553600">
        </datacontractserializer></servicedebug></servicemetadata></servicethrottling></behavior>
      </servicebehaviors>
    </behaviors>
  </system.servicemodel>
 

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

 

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

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值