如何实现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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

Linux基础(day50)

12.10 Nginx访问日志 Nginx访问日志目录概要 日志格式 vim /usr/local/nginx/conf/nginx.conf //搜索log_...

2219
来自专栏SpiritLing

IIS前端页面不显示详细错误解决方法

要想解决这个问题,有三种方法可以考虑: 1.Internet信息服务(IIS)管理器 2.Web.config文件 3. 命令行 在IIS的“错误页”右边的“编...

3105
来自专栏IT技术精选文摘

精讲Redis:持久化

从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。

1593
来自专栏王磊的博客

你必须知道的session与cookie

1293
来自专栏三杯水

系统重启后nginx reload不生效原因分析

这是一种比较少见,困扰我很久的问题,虽然这个问题很简单,但是找到根本原因还是费了不少时间,现在把分析过程分享如下。

3732
来自专栏博客园

Redis事务

和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULIT,EXEC,DISCARD,WATCH这个四个命令是实现事务的基...

1982
来自专栏王磊的博客

关于c# SESSION丢失问题解决办法

我们在用C#开发程序的时候经常会遇到Session很不稳定,老是数据丢失。下面就是Session数据丢失的解决办法希望对您有好处。 1、在WEB.CONFIG...

5065
来自专栏王磊的博客

你必须知道的session与cookie

Session本质 提到Session我们能联想到的就是用户登录功能,而本身我们使用Session的基础是通过url进行访问的,也就是使用http协议进行访问的...

3629
来自专栏技术支持log

linux操作系统无损升级文件系统ext3至ext4--数据盘篇

linux操作系统无损升级文件系统ext3至ext4: 这里我们以CentOS7.0操作系统来作为示例升级数据盘文件系统: 附: linux操作系统无损升级...

3651
来自专栏西安-晁州

Docker下redis的主从、持久化配置

Docker下redis的主从、持久化配置 redis是k-v型nosql数据库,支持字符串(string)、列表(list)、集合(set)、散列(hash)...

58410

扫码关注云+社区

领取腾讯云代金券