Fork me on GitHub

基于WAS 部署WCF服务

Windows (Process) Activation Service (WAS)作为 IIS7.0 特有的新增功能,和以前IIS 6.0的功能相比更加强大,因为它提供并支持除HTTP之外的更多协议,比如TCP方式和Pipe(管道)方式。利用WAS作为WCF(Windows Communication Foundation)的宿主,我们能充分利用WAS的很多优点,因为我们再也不用为非HTTP方式的WCF Service单独编写宿主程序了。而WAS本身的特点,也让我们的服务端程序能享受到只有以往的HTTP方式的WCF Service才能拥有的很多特性。

WAS在Windows Vista/7/2008/R2中,其实是由一个单独的Windows Service来实现的 在Windows服务里头可以找到一个Windows Service,就叫做"Windows Process Activation Service"。由此看来,WAS的进程和IIS进程在物理上是隔离开的,能为我们提供一个灵活、稳定的WCF Service宿主环境。WAS内部的工作机制,大致和ASMX WebService类似。

IIS 7上 引入了以下三组网络监听器(Listener)和监听适配器(Adapter),实现了基于TCP、Named Pipes和MSMQ的网络监听。分别是:

  • TCPListener|TCP Listener Adapter
  • NamedPipes Listener|Named Pipes Listener Adapter
  • MSMQ Listener|MSMQ Listener Adapter

    在IIS 7的结构如下

    iisWas 

  •  

    由于IIS 7提供了基于非HTTP网络协议的监听支持,那么就意味着当我们当我们通过IIS进行WCF服务寄宿(Hosting)的时候,可以采用非HTTP的通信方式。其中的TCPListener|TCP Listener Adapter 依赖于服务NetTcpPortSharing,为net.tcp绑定提供tcp的端口共享,具体可参看启用WCF NetTcpBinding的共享端口

    首先,我们需要查看Windows 7/2008 R2的组件中,是否打开了WAS的功能,打开控制面板,打开“程序和功能”对话框,在"打开/关闭 Windows功能"对话框中,确保下面图中的功能项被打开:

  • iiswasenable

    其实在这一部操作之后,windows会自动帮我们在IIS中做好配置,打开IIS的站点配置,检查IIS站点中的绑定:

    wcf2

    确保net.tcp方式,绑定到808端口

    打开站点的高级设置,确认"已启用的协议"中,填有"net.tcp",没有的话,可以补上。

    wcf3

     

     

    然后是建立应用程序目录,这个目录等下会用来部署WCF的Service端程序。建立好目录后,检查"高级设置–已启用的协议"中,是否已填上net.tcp,如果没有手工填上。到这里,基本的host环境我们已经设置好了。

    服务端的配置如下:

        <system.serviceModel>
            <services>
          <service name="DummyEnterpriseService.Implementation.DummyService"
            behaviorConfiguration="DummyServiceBehavior" >
            <!-- Service Endpoints -->
            <endpoint address=""
                      binding="netTcpBinding"
                      contract="DummyEnterpriseService.Interface.IDummyService">
            </endpoint>
          </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="DummyServiceBehavior">
                        <serviceMetadata httpGetEnabled="true"/>
                        <serviceDebug includeExceptionDetailInFaults="false"/>
                    </behavior>
                </serviceBehaviors>
            </behaviors>
        </system.serviceModel>

    这里要注意的是endpoint的 address的填写,我填写成"net.tcp://192.168.1.100/DummyService“,得到下图的错误:

    wasIIS

    然后把address改成空的或者不设置就OK了,没有搞明白其中的道理。

    相应的客户端的配置写法也比较特别:

    <system.serviceModel>
            <client>
                <endpoint address="net.tcp://192.168.1.100/DummyEnterpriseServicePublisher/DummyService.svc" binding="netTcpBinding" contract="DummyEnterpriseService.Interface.IDummyService"/>
            </client>
    </system.serviceModel>

    endpoint的地址和http方式一样的,就是从http换成net.tcp而已。

     

    使用 WAS 扩展 HTTP 之外的 WCF 服务

  • posted @ 2010-01-24 22:35  张善友  阅读(5554)  评论(4编辑  收藏  举报