2009-10-13 247 views
44

我们开发了一个WCF服务,我们正在寻找部署它。 我们的客户将与basicHttpBinding一起使用,但我们的内部团队将与namedPipesBinding一起使用。IIS WCF服务托管与Windows服务

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

基址被忽略时,WCF服务主机在IIS中,我们也看到在计算器上(见WCF service configuration file question regarding <baseAddresses>

+1

它总是取决于上下文。根据微软的说法,“你不应该考虑企业场景的自托管,在企业项目的开发或演示阶段,自托管是合适的”https://msdn.microsoft.com/zh-cn/library/bb332338。 aspx – Jayee 2016-06-22 04:35:28

回答

10

要在这些问题答案:

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

当您使用IIS托管你的服务,你必须配置您的App.config文件或web.config文件,以允许IIS揭露一些有约束力的,所以在配置文件中,你会把所有的绑定,允许到您的wcf服务。 Http,net.tcp等...

在你的绑定你不会指定地址,因为你将直接在IIS中指定这些地址。

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

您将直接在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> 

在你的IIS设置上级篇你就会把

HTTP,在的net.tcp启用的协议

之后,你会在你走绑定到IIS。把你的HTTP normaly结合,并添加一个新的绑定的net.tcp,在绑定配置让像

8001端口和虚拟目录:*

此设置允许所有连接到8001端口用于任何虚拟目录。

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

+0

非常感谢,它解决了我与IIS的麻烦。 – esylvestre 2009-10-14 14:05:19

+0

http绑定是否也需要与net.tcp一起存在。如果我在绑定中只有net.tcp将被激活 – user55474 2011-02-02 13:00:24

5

IIS为您提供了很多外的现成功能,如应用程序域重新加载,监控等。

这就是为什么你应该先回答这个问题:你需要这一切功能,或者不? 如果没有 - 可以考虑windows服务。

+1

你是对的,但在问自己这些问题之前,我想知道我的服务的初始配置(绑定)是否可以由IIS管理。 – esylvestre 2009-10-13 14:48:56

71

主机在IIS中有许多优点和许多缺点。

是,IIS为您提供了按需加载 - 这可能是一个加号或减号。当请求进入时,ServiceHost被构造,然后托管的服务类被实例化,并且处理请求。没有什么需要全天候运行。但是与此同时,这种设置在每次发送消息时都需要更多的时间和精力,而作为程序员的您实际上对于服务主机并没有太多的控制权。

是的,与IIS,其中* .svc文件驻留定义你的地址的虚拟目录 - 在你的配置任何基地址或明确定义的地址被忽略。没有太多努力,您无法更改服务地址的布局 - 它们始终是http://servername/virtualdirectory/YourService.svc(包括.svc扩展名)。

因为您的ServiceHost已经启动并正在运行,所以自托管速度通常要快几倍 - 但是要确保它的真正启动和运行,每当有消息进入时就没有“按需”加载,或者它已经启动并且可以为请求提供服务,或者不可以。但是,您对服务主机有更多的控制权 - 何时以及如何构建等,并且您可以根据需要选择并定义服务地址。

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

马克

+0

这正是我正在寻找的,但我想知道是否有工具来管理WCF服务时,他们自我托管?实际上,在IIS中托管它的主要目的是为用户提供一个友好的工具来配置我们的服务。 – esylvestre 2009-10-13 15:14:10

+1

“都柏林”可能是我期待的工具。 非常感谢。 – esylvestre 2009-10-13 17:09:46

+0

WCF的管理故事现在不是很辉煌 - 微软承诺用更多的工具支持“都柏林”(服务器插件在.NET 4.0之后的某个时候发布) – 2009-10-14 09:34:19

26

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

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

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

你可以轻松地做URL重写省略.SVC如果你烦恼。

+5

我完全同意,你可以创建一个自定义的ServiceHostFactory来获得对你的ServiceHost的更多控制。 – 2010-06-21 13:28:45

+0

通过IIS管理SSL证书和htttp端口绑定也更“容易”。 – 2016-09-26 13:51:18

+2

作为最近的一个轶事例子,在IIS中托管相同的net.tcp消息日志记录服务会消耗3倍多的内存,并处理1/2请求数量,因为“自我”托管Windows服务中的相同服务。 – StingyJack 2017-10-13 12:07:20

15

有趣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

7

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

请查看以下链接:(http://msdn.microsoft.com/en-us/library/ms730158.aspxhttp://msdn.microsoft.com/en-us/library/bb332338.aspx),想想你的约束:

  • 手术系统
  • 预期的表现
  • 可用HW
  • 预期可用性

和你会发现在许多情况下,“自我托管”是bes替代方案。

+0

引用自托管的缺点:有限的功能:自托管应用程序对高可用性,易管理性,健壮性,可恢复性,版本控制和部署方案的支持有限。至少,开箱即用的WCF不提供这些功能,因此在自主托管的场景中,您必须自己实现这些功能;例如,IIS在默认情况下提供了其中一些功能。微软表示,自主托管并不是完全由于这些原因的服务的企业解决方案。请参阅此处的比较https://msdn.microsoft.com/en-us/library/ms730158.aspx – 2016-09-26 14:00:33

0

虽然这里有选择的答案,但我会允许自己发布Q/A线程链接。

How to configure WCF service from code when hosted in IIS?

,你会在我的答案在那里找到什么(和它的链接)是你的了,你是否加载它WService或IIS服务主机精细控制。

服务启动后,您可以对IIS进行intergate绑定,并创建适当的端点。通过Microsoft.Web.Administration命名空间查找IIs配置。

希望这会有所帮助。