IIS WCF服务托pipe与Windows服务

我们开发了一个WCF服务,我们正在考虑部署它。 我们的客户将使用它与basicHttpBinding但我们的内部团队将与namedPipesBinding使用它。

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

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

在这些问题上回答:

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

当您使用IIS来承载您的服务时,您必须configuration您的App.config文件或web.config文件以允许IIS公开一些绑定,因此在您的configuration文件中,您将把所有允许的绑定到您的wcf服务。 HTTP,NET.TCP等…

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

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

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

有一个例子。

你的configuration文件:

 <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 advenced设置你的意志

http,启用协议中的net.tcp

之后,你将进入你的绑定到IIS。 把你的绑定为正常的http,并添加一个新的绑定net.tcp,在绑定configuration把端口和虚拟目录

8001:*

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

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

在IIS中托pipe有许多优点和许多缺点。

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

是的,在IIS中,* .svc文件所在的虚拟目录将定义您的地址 – 您的configuration中的任何基址或明确定义的地址都将被忽略。 没有太多的努力,你不能改变服务地址的布局 – 他们总是要http://servername/virtualdirectory/YourService.svc (包括.svc扩展名)。

自托pipe通常要快得多,因为ServiceHost已经启动并正在运行 – 但是要确保它真正启动并正常运行,每当有消息进入时都没有“按需”加载 – 无论是启动还是启动可以服务请求,或不。 但是,您对服务主机有更多的控制权 – 何时以及如何构build等等,并且您可以根据需要select并定义服务地址。

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

渣子

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

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

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

如果你感到困扰,你可以轻松地做URL重写来省略.svc。

有趣的tidbit->阅读这个线程后,我在MSDN中遇到了有关使用Windows服务托pipeWCF服务的这些词语:

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

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

…和以下链接:

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

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

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

  • 操作系统
  • 预期的performance
  • 可用的硬件
  • 预计可用性

你会发现在很多情况下,“自我托pipe”是最好的select。

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

这就是为什么你应该首先回答这个问题:你需要所有这些function吗? 如果没有 – 可以考虑windows服务。

虽然这里有select的答案,但我会允许自己发布一个Q / A的主题链接。

如何在IIS中托pipe代码时configurationWCF服务?

你会发现在我的答案(和链接)是你的服务主机无论你加载它在WService或IIS的罚款控制。

一旦服务启动,你可以intergate IIS有什么绑定,并创build适当的端点。 通过Microsoft.Web.Administration命名空间查找IIsconfiguration。

希望这有助于一点。