如何实现IIS 7.0对非HTTP协议的支持
在《再谈IIS与ASP.NET管道》介绍各种版本的IIS的设计时,我们谈到IIS 7.0因引入WAS提供了对非HTTP协议的支持。这个对于WCF的服务寄宿来说意义重大,它意味着我们通过IIS/WAS寄宿的服务终结点不仅仅可以采用BasicHttpBinding、WSHttpBinding/WS2007HttpBinding等基于HTTP协议的绑定,也可以采用NetTcpBinding、NetNamedPipeBinding和NetMsmqBinding。
在默认的情况下,IIS 7.0针对非HTTP支持的特性是关闭的。为了将一个IIS中的Web应用作为WCF服务的宿主,并采用非HTTP的通信协议,我们不但需要为Web应用所在的站点添加相应的站点绑定(net.tcp、net.pipe和net.msmq等),还需要为Web应用本身进行相应的设置使之允许相应的通信协议。我们可以通过三种方式实现相应的设置。
一、命令行设置
我们可以以命令行的方式执行Appcmd.exe来设置站点绑定和开启某个Web应用针对某种协议的支持,该命令所在的目录为%windir%\system32\inetsrv\。如下所示的命令通过Appcmd.exe为默认站点(Default Web Site)添加了基于net.tcp、net.pipe和net.msmq的站点绑定,其中net.tcp绑定采用默认端口808。然后在该站点下创建了一个名称为WcfServices的Web应用,映射的物理路径是C:\WcfServices\Service。最后为创建的Web应用同时开启了针对http、net.tcp、net.pipe和net.msmq四种协议的支持。
1: REM 为站点” Default Web Site”添加针对net.tcp,net.pipe和net.msmq站点绑定
2: appcmd.exe set site "Default Web Site" –+bindings.[protocol='net.tcp',bindingInformation='808:*']
3: appcmd.exe set site "Default Web Site" –+bindings.[protocol='net.pipe',bindingInformation='*']
4: appcmd.exe set site "Default Web Site" –+bindings.[protocol='net.msmq',bindingInformation='localhost']
5:
6: REM 创建Web应用WcfServices
7: appcmd add app /site.name:"Default Web Site" /path:/WcfServices /physicalpath:C:\WcfServices\Service
8:
9: REM 为WcfServices应用开启对http、net.tcp、net.pipe和net.msmq的支持
10: appcmd.exe set app "Default Web Site/WcfServices" /enabledProtocols:http,net.pipe,net.tcp,net.msmq
二、配置文件设置
所有方式的设置都体现在对相应配置文件的修改。IIS 7.0中用于控制站点绑定和Web应用针对某个协议的支持的配置文件为applicationHost.config,该配置文件保存的目录为%windir%\system32\inetsrv\config\。我们可以直接修改这个配置文件来完成我们需要的设置。
存在于applicationHost.config中的如下这段配置就是上面的命令行执行的结果。三个新增的站点绑定被添加到了表示站点配置节的<bindings>节点中,而表示我们创建的Web应用的<application>节点的enabledProtocols属性中包含了我们通过命令行设置的四种协议。
1: <configuration>
2: ...
3: <system.applicationHost>
4: ...
5: <sites>
6: ...
7: <site name="Default Web Site" id="1" serverAutoStart="true">
8: ...
9: <application path="/WcfServices" enabledProtocols="http,net.pipe,net.tcp,net.msmq">
10: <virtualDirectory path="/" physicalPath="C:\WcfServices\Service" />
11: </application>
12: <bindings>
13: <binding protocol="http" bindingInformation="*:80:" />
14: <binding protocol="net.tcp" bindingInformation="808:*" />
15: <binding protocol="net.pipe" bindingInformation="*" />
16: <binding protocol="net.msmq" bindingInformation="localhost" />
17: </bindings>
18: </site>
19: </sites>
20: </system.applicationHost>
21: </configuration>
三、IIS管理器设置
IIS管理器本身提供了可视化的方式是我们很容易地实现对站点绑定的添加、删除和修改。如图7-11所示,如果我们在IIS管理器中选择相应的站点,在右边“编辑网站”一栏会出现一个“绑定…”按钮。点击该按钮会出现一个“网站绑定”的对话框,当前站点的所有绑定会在这个对话框中列表。我们可以编辑和删除现有的站点绑定,也可以添加新的站点绑定。IIS管理器只提供了针对站点绑定的设置,为站点中具体某个Web应用开启或者关闭某种协议的支持还得需要通过上面两种方式来完成。
为作为WCF服务宿主的Web应用和它所在的站点进行了如上的设置之后,我们就可以直接将基于HTTP的终结点绑定直接替换成基于其他协议类型的绑定。下面配置片断所示的客户端终结点采用了NetTcpBinding,而地址代表部署在宿主Web应用的.svc文件地址。
1: <configuration>
2: <system.serviceModel>
3: <client>
4: <endpoint name="calculatorservice"
5: address="net.tcp://localhost/WcfServices/CalculatorService.svc"
6: binding="netTcpBinding"
7: contract="Artech.WcfServices.Service.Interface.ICalculator"/>
8: </client>
9: </system.serviceModel>
10: </configuration>