WCF : 如何将NetTcpBinding寄宿在IIS7上

摘要 : 从IIS 7 开始, IIS增加了对非HTTP协议的支持. 因此, 自IIS 7之后, 可以将NetTcpBinding等非HTTP协议的Bindings直接寄宿在IIS上面. 本文将介绍如何在IIS上配置WCF NetTcpBinding, 并且对其工作的方式进行比较深入的讨论.

Windows Process Activation Service

下图是IIS监听在HTTP协议上的工作方式. 对HTTP协议的监听是在内核模式下的HTTP.sys的帮助下完成

从IIS7开始,IIS还加入了对非HTTP协议的支持。对于那些采用非HTTP协议,但是又需要部署在IIS里面,从而利用IIS优秀的管理功能的服务来说,比如WCF服务,可谓一大福音。IIS7可以支持多种非HTTP协议,比如net.tcp,net.msmq, net.pipe等。由于HTTP.sys并不会监听非HTTP协议的端口. 对于非HTTP协议, 则有各自的Windows Serivce来进行监听. 例如Net.Tcp协议, 则是由Net.Tcp Port Sharing Service和Net.Tcp Listener Adapter服务进行监听, 并且寄宿在SMSvcHost.exe中.

进过拆分之后, WAS不仅处理HTTP请求,还可以处理非HTTP协议的请求。HTTP请求是由Http.sys截获的,并且在传递给WAS之前,就已经传递给w3svc中的HTTP管理器,但是,其他请求都是通过WAS侦听器的适配器接口转发给配置管理器和进程管理器的,而没有经过w3svc。

关于 WAS的介绍可以参考这里 :

http://msdn.microsoft.com/en-us/library/ms734677(v=vs.110).aspx

http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/02/08/iis-7-support-for-non-http-protocols.aspx

为了让IIS支持net.tcp,必须先安装WAS(Windows Process Activation Service),即windows进程激活服务。

打开控制面板--程序和功能--打开或关闭windows功能,安装WAS,如图:

安装完毕后在Services窗口中可以到到如下服务:Windows Process Activation Service;Net.Msmq Listener Adapter;Net.Pipe Listener Adapter;Net.Tcp Listener Adapter;Net.Tcp Port Sharing Service.这几个服务。确定Net.Tcp Listener Adapter 与Net.Tcp Port Sharing Service是否已经启动。

同样, 也需要检查WCF是否启用了Non-Http的支持. .Net Framework 3.5和 .Net Framework 4.5分别有各自的支持.

不过上述的Services只会存在一个, 如果服务器上只有.Net Framework 3.5本版的被启用, 则这些Services则只能使用3.5版本的DLL. 如果.Net Framework 4.5版本一旦被启用, 无论是否同时启用了3.5版本, 则会使用4.5版本. 可以通过服务所使用的SMSvcHost.exe来判断实际使用了那一个版本.

IIS 上的配置

在IIS中,选中你的网站,然后在右边的操作菜单栏中单击绑定,会弹出一个“网站绑定”窗口,点击添加,类型选择net.tcp

选择你的网站,点击“高级设置”,弹出的的窗体中,在“已启用的协议”一栏中手动添加:net.tcp. 做完这一步之后, 该网站即增加了对net.tcp协议的支持.

示例

示例是用VS2012新建的WCF模板.

 1     public class Service1 : IService1
 2     {
 3         public string GetData(int value)
 4         {
 5             return string.Format("You entered: {0}", value);
 6         }
 7
 8         public CompositeType GetDataUsingDataContract(CompositeType composite)
 9         {
10             if (composite == null)
11             {
12                 throw new ArgumentNullException("composite");
13             }
14             if (composite.BoolValue)
15             {
16                 composite.StringValue += "Suffix";
17             }
18             return composite;
19         }
20     }

下面是使用了NetTcpBinding的WCF Service的配置.

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NewBinding1" />
      </netTcpBinding>
    </bindings>
    <services>
      <service name="NetTcpSite.Service1">
        <endpoint binding="netTcpBinding" bindingConfiguration="NewBinding1"
        contract="NetTcpSite.IService1" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />

      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

由于WCF 4.5对默认配置进行了优化. 所以即使没有关于HTTP协议的任何配置, WCF Service默认情况下也能通过浏览器的方式访问到WSDL.

如果要访问NetTcpBinding的WCF Service则需要一个同样采用Net.TCP协议的客户端. 这里, 我使用了VS 2012来完成.

下面是WCF客户端的的配置和代码.

    class Program
    {
        static void Main(string[] args)
        {
            using (NetTcpService.Service1Client proxy = new Service1Client())
            {
                Console.WriteLine(proxy.GetData(10));
            }
            Console.ReadLine();
        }
    }
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IService1" />
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost/NetTcpSite/Service1.svc"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService1"
                contract="NetTcpService.IService1" name="NetTcpBinding_IService1">
                <identity>
                    <servicePrincipalName value="host/LIGHTWEAPON.fareast.corp.microsoft.com" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

我们进一步来观察是哪一个进程监听在Net.Tcp占用的808端口上. 从下图上可以验证出, 监听在808端口上的进程是2060. 这个进程ID是SMSvcHost.exe, 也就是上面提到的各种Services的宿主进程.

时间: 2024-10-12 00:27:41

WCF : 如何将NetTcpBinding寄宿在IIS7上的相关文章

WCF绑定netTcpBinding寄宿到IIS

继续沿用上一篇随笔中WCF服务类库 Wettery.WcfContract.Services WCF绑定netTcpBinding寄宿到控制台应用程序 服务端 添加WCF服务应用程序 Wettery.WcfIISHost.Services,其中添加两个WCF服务,GameService.svc  PlayerService.svc,删掉契约接口和 .cs内嵌文件,只留下.svc文件 我们通过Autofac注入契约/服务的依赖关系,Nuget引用 Install-Package Autofac.W

[转]WCF的几种寄宿方式

转自:WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详细介绍并开发例子进行说明,以求大家对WCF寄宿的方式进行全面的认识和了解. 1. WCF服务的IIS服务寄宿 我在我前面几篇WCF开发框架的介绍文章中,介绍过了WCF常用的一种寄宿方式,IIS服务寄宿.这种寄宿方式是最为方便的方式,而且由于服务

[WCF实践]1.WCF使用net.tcp寄宿到IIS中

一.IIS部分 环境:Windows Server 2008 R2 1.安装WAS,如下图所示: 2.网站net.tcp协议绑定,如下图所示: 3.网站启用net.tcp,如下图所示: 二.WCF代码部分 1.DesignCaseService.svc <%@ServiceHostLanguage="C#"Debug="true"Service="Web.API.Implementations.DesignCaseService"%>

微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务

WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详细介绍并开发例子进行说明,以求大家对WCF寄宿的方式进行全面的认识和了解. 1. WCF服务的IIS服务寄宿 我在我前面几篇WCF开发框架的介绍文章中,介绍过了WCF常用的一种寄宿方式,IIS服务寄宿.这种寄宿方式是最为方便的方式,而且由于服务只需要IIS运行就能自动运行起来,因此广为使用. 创建这

A网站引用B服务器虚拟目录文件导致:网站部署到IIS7上出现HTTP 错误 500.19(由于权限不足而无法读取配置文件)的问题

A网站引用B服务器共享目录(虚拟目录)导致:网站部署到IIS7上出现HTTP 错误 500.19(由于权限不足而无法读取配置文件)的问题 本攻略并不是本机的部署导致的HTTP 错误 500.19 问题  本机500.19错误 解决办法连接 HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginRequest 处理程序 尚未确定 错误代码 0x80070005 配置

IIS7 上传 下载文件大小限制的设置

IIS7 上传 下载文件大小限制的设置 本文来自IISBOY网 一.找到修改大小的配置文件和配置节点 本文来自IISBOY网 打开你系统盘(我是C盘),找到 C:\Windows\System32\inetsrv\config\schema目录,该目录下有一个IIS_schema.xml,右击打开文件,Ctrl+F,然后输入"     内容来自iisboy <attribute name="maxAllowedContentLength" type="uint

Windows Server 2008R2 IIs7 上传文件限制的解决方法

IIS7.0的修改方法如下: 1.打开IIS管理器→ 双击"IIS"中的"ASP"→ 打开"配置 ASP 应该程序的属性"→ 展开"限制属性": 2.修改"最大请求实体主体限制"的值,默认值为200000(即不到200KB): 3.把它修改为你想修改的大小,如:52000000(50MB): 4.修改完成点击"应用"OK! 附:iis7 上传大文件限制的真正解决办法 1.打开"

在IIS7上导出所有应用程序池的方法 批量域名绑定

在IIS7+上导出所有应用程序池的方法: %windir%/system32/inetsrv/appcmd list apppool /config /xml > c:/apppools.xml 这个命令会将服务器上全部的应用程序池都导出来,但有些我们是我们不需要的,要将他们删掉.比如: DefaultAppPool Classic .Net AppPool 如果在导入时发现同名的应用程序池已经存在,那么导入就会失败. 导入应用程序池的方法: %windir%/system32/inetsrv/

针对个别utf8编码站点在iis7上浏览器编码不能自动识别的解决方法

个别utf8编码站点在iis7上客户端浏览器编码不能自动识别的编号,输入仍为gbk2312,而不是utf-8,这样导致我们看到的网站为乱码. 要解决这个问题,有两个方法,一为打开网站以后,右键,选择编码,然后选择utf-8,这样网站就显示正常了.当然这个法对于站长来说行不通,我们的网站是给人看的,没有人看网站会想到或是会去将客户端浏览器去手动改编码. 所以我们只能是选用第二个方法: 在站点根目录下面创建一个web.config文件,放入以下内容: <?xml version="1.0&qu