IIS WCF服务托管与Windows服务

esy*_*tre 45 .net c# iis wcf was

我们开发了WCF服务,我们正在寻求部署它.我们的客户将使用它,basicHttpBinding但我们的内部团队将使用它namedPipesBinding.

我们想知道在IIS 7或Windows服务中托管它是否更好.我们运行了一些测试,我们发现当我们在IIS中添加绑定时,它不会更新我们服务的配置文件.这意味着我们需要在两个不同的地方维护配置.这不符合逻辑,对吗?

我们还在StackOverflow上读到当WCF服务是IIS中的主机时忽略基址(请参阅有关<baseAddresses>的WCF服务配置文件问题)

mar*_*c_s 76

在IIS中托管有许多优点和许多缺点.

是的,IIS为您提供按需加载 - 这可以是加号或减号.当请求进入时,构造ServiceHost,然后实例化托管的服务类,并处理请求.没有什么需要全天候运行.但与此同时,每次收到消息时,这种设置都需要更多的时间和精力,而且作为程序员,您真的无法控制服务主机.

是的,使用IIS,*.svc文件所在的虚拟目录定义了您的地址 - 您的配置中的任何基地址或明确定义的地址都将被忽略.并且不需要太多努力,您就无法更改服务地址的布局 - 它们总是为http://servername/virtualdirectory/YourService.svc(包括.svc扩展名).

自托管通常更快,因为您的ServiceHost已经启动并运行 - 但是由您来确保它真正启动并运行,每当有消息进入时都没有"按需"加载 - 无论是它还是可以服务请求,或不.但是您可以更好地控制服务主机 - 何时以及如何构建服务主机等等,您可以根据需要选择并定义服务地址.

我个人几乎总是选择使用自托管 - 在控制台应用程序中进行测试,在NT服务中进行生产.对我来说,这似乎是更合适的方式,也是更加可控的方式.你必须做更多的工作 - 但你确切知道你在做什么.


Che*_*eso 26

marc_s通常给出我完全同意的很好的答案,但在这种情况下,我没有.
WCF的自托管并不是一个好主意,尤其是微软即将发布都柏林技术.在IIS中托管时,WCF(和WF)应用程序的管理和操作要简单得多.

此外,您还可以获得按需加载.

IIS7.5(WS2008 R2)有一个永远在线的选项.

如果困扰你,你可以轻松地进行URL重写以省略.svc.

  • 我完全同意,另外您可以创建自定义ServiceHostFactory以获得对ServiceHost的更多控制. (5认同)
  • 作为最近的一个轶事示例,在IIS中托管相同的net.tcp消息日志记录服务会占用3倍的内存,并处理在Windows服务中"自我"托管相同服务时的请求数量的1/2. (3认同)

atc*_*way 16

有趣的tidbit->在阅读这个帖子后,我在MSDN中遇到了关于使用Windows服务托管WCF服务的这些词:

以下是Windows服务的一些缺点:

•部署:必须使用.NET Framework Installutil.exe实用程序或通过安装程序包中的自定义操作安装服务.
•有限的功能:Windows服务仍然具有一组有限的开箱即用功能,以支持高可用性,易管理性,版本控制和部署方案.基本上,您必须自己通过自定义代码来满足这些要求,例如,IIS默认情况下会提供其中的一些功能.Windows服务确实增加了可恢复性和一些安全功能,但您仍需要自己做一些工作.
http://msdn.microsoft.com/en-us/library/bb332338.aspx

......以及以下链接:

托管服务:(漂亮的比较图表)
http://msdn.microsoft.com/en-us/library/ms730158.aspx


Céd*_*vin 11

回答这些问题:

我们运行了一些测试,我们发现当我们在IIS中添加绑定时,它不会更新我们服务的配置文件.这意味着我们需要在两个不同的地方维护配置.这不是逻辑,对吗?

当您使用IIS来托管服务时,必须配置App.config文件或web.config文件以允许IIS公开某些绑定,因此在配置文件中,您将把所有绑定放到wcf服务中.Http,net.tcp等......

在绑定中,您不会指定地址,因为您将直接在IIS中指定这些地址.

在IIS中,您必须允许在网站的高级设置中使用绑定.之后,您将为您的网站"Web服务"设置新绑定,并添加您想要监听的每个绑定,并指定地址.

您将直接在IIS中指定地址.

有一个例子.

你的配置文件:

<services>
    <service name="ServiceName">                    
        <endpoint address=""
            binding="basicHttpBinding"
            bindingConfiguration="httpMode"
            contract="IContract" />                 
        <endpoint address=""
            binding="netTcpBinding"
            contract="IContract" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
</services>
Run Code Online (Sandbox Code Playgroud)

在你的IIS advenced设置你的意志

启用协议中的http,net.tcp

之后,您将进入IIS绑定.把你的绑定为http normaly并添加一个新的绑定net.tcp,在绑定配置中把端口和虚拟目录放在一起

8001:*

此设置允许所有虚拟目录连接到8001端口.

您还必须在服务器上安装"WCF激活,(Http激活和非Http激活)"功能.


Raf*_*afa 7

这个问题没有标准答案.我完全不同意Cheeso的答案(WCF的自托管并不是一个好主意).

以下链接请检查:(http://msdn.microsoft.com/en-us/library/ms730158.aspx,http://msdn.microsoft.com/en-us/library/bb332338.aspx),想想你的限制:

  • 操作系统
  • 预期的表现
  • 可用的HW
  • 预期可用性

你会发现在很多情况下"自托管"是最好的选择.


Vit*_*sky 5

IIS为您提供了许多开箱即用的功能,如应用程序域重新加载,监控等.

这就是为什么你应该首先回答这个问题:你是否需要所有这些功能?如果没有 - 可以考虑Windows服务.