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的网络监听。分别是:
在IIS 7的结构如下
由于IIS 7提供了基于非HTTP网络协议的监听支持,那么就意味着当我们当我们通过IIS进行WCF服务寄宿(Hosting)的时候,可以采用非HTTP的通信方式。其中的TCPListener|TCP Listener Adapter 依赖于服务NetTcpPortSharing,为net.tcp绑定提供tcp的端口共享,具体可参看启用WCF NetTcpBinding的共享端口。
首先,我们需要查看Windows 7/2008 R2的组件中,是否打开了WAS的功能,打开控制面板,打开“程序和功能”对话框,在"打开/关闭 Windows功能"对话框中,确保下面图中的功能项被打开:
其实在这一部操作之后,windows会自动帮我们在IIS中做好配置,打开IIS的站点配置,检查IIS站点中的绑定:
确保net.tcp方式,绑定到808端口
打开站点的高级设置,确认"已启用的协议"中,填有"net.tcp",没有的话,可以补上。
然后是建立应用程序目录,这个目录等下会用来部署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“,得到下图的错误:
然后把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而已。