我们开发了WCF服务,我们正在寻求部署它。
我们的客户将basicHttpBinding
使用它,但我们的内部团队将使用namedPipesBinding
。
我们想知道在IIS 7或Windows服务中托管它是否更好。 我们运行了一些测试,我们发现当我们在IIS中添加绑定时,它不会更新我们服务的配置文件。这意味着我们需要在两个不同的地方维护配置。这不符合逻辑,对吗?
我们还在StackOverflow上读到,当IIS中的WCF服务是主机时,将忽略基址(参见WCF service configuration file question regarding <baseAddresses>)
答案 0 :(得分:75)
在IIS中托管有许多优点和许多缺点。
是的,IIS为您提供按需加载 - 这可以是加号或减号。当请求进入时,构造ServiceHost,然后实例化托管的服务类,并处理请求。没有什么需要全天候运行。但与此同时,每次收到消息时,这种设置都需要更多的时间和精力,而且作为程序员,您真的无法控制服务主机。
是的,使用IIS,* .svc文件所在的虚拟目录定义了您的地址 - 您的配置中的任何基地址或明确定义的地址都将被忽略。并且不需要太多努力,您就无法更改服务地址的布局 - 它们总是http://servername/virtualdirectory/YourService.svc(包括.svc扩展名)。
自托管通常更快,因为您的ServiceHost已经启动并运行 - 但是您可以确保它真正启动并运行,无论何时收到消息都没有“按需”加载 - 要么它起来了,可以服务请求,或不。但是您可以更好地控制服务主机 - 何时以及如何构建服务主机等等,您可以根据需要选择并定义服务地址。
我个人几乎总是选择使用自托管 - 在控制台应用程序中进行测试,在NT服务中进行生产。对我来说,这似乎是更合适的方式,也是更加可控的方式。你必须做更多的工作 - 但你确切知道你在做什么。
马克
答案 1 :(得分:26)
此外,您还可以获得按需加载。
IIS7.5(WS2008 R2)有一个永远在线的选项。
如果困扰你,你可以轻松地进行URL重写以省略.svc。
答案 2 :(得分:16)
有趣的花絮 - &gt;在阅读此主题后,我在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
答案 3 :(得分: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>
在您的IIS advenced设置中,您的意愿
启用协议中的http,net.tcp
之后,您将进入IIS绑定。把你的绑定为http normaly并添加一个新的绑定net.tcp,在绑定配置中把端口和虚拟目录放在一起
8001:*
此设置允许所有虚拟目录连接到8001端口。
您还必须在服务器上安装“WCF激活,(Http激活和非Http激活)”功能。
答案 4 :(得分:7)
这个问题没有标准答案。我完全不同意Cheeso的答案(WCF的自托管不是一个好主意)。
请检查以下链接:(http://msdn.microsoft.com/en-us/library/ms730158.aspx,http://msdn.microsoft.com/en-us/library/bb332338.aspx)并考虑您的约束:
你会发现,在很多情况下,“自托管”是最佳选择。
答案 5 :(得分:5)
IIS为您提供了许多开箱即用的功能,例如应用程序域重新加载,监控等。
这就是为什么你应该首先回答这个问题:你是否需要所有这些功能? 如果没有 - 可以考虑使用Windows服务。
答案 6 :(得分:0)
虽然这里有选定的答案,但我会允许自己发布一个Q / A线程链接。
How to configure WCF service from code when hosted in IIS?
您在我的答案中找到的内容(以及其中的链接)是您对服务主机的精确控制,无论您是在WService中还是在IIS中加载它。
在服务启动时,您可以将IIS与其具有的绑定进行交互,并创建适当的端点。通过Microsoft.Web.Administration命名空间查找IIs配置。
希望这有点帮助。