basicHttpBinding
, 而我们的内部团队将使用namedPipesBinding
。我们想知道是在 IIS 7 中托管更好还是使用 Windows Service。我们进行了一些测试,发现当我们在IIS中添加绑定时,它不会更新服务的配置文件。这意味着我们需要在两个不同的地方维护配置,这是不合逻辑的,对吧?
我们还在 StackOverflow 上读到过这样一句话:当WCF服务在IIS中托管时,基地址会被忽略。详见有关<baseAddresses>的WCF服务配置文件问题。
basicHttpBinding
, 而我们的内部团队将使用namedPipesBinding
。IIS托管具有许多优点和缺点。
是的,IIS为您提供按需加载 - 这可能是一个优点或缺点。当请求到达时,ServiceHost被构建,然后实例化正在托管的服务类,并处理请求。没有必要全天候运行。但同时,这种设置需要更多的时间和精力每次消息到来时,您作为程序员对您的服务主机没有太多控制权。
而且,使用IIS时,*.svc文件所在的虚拟目录定义了您的地址 - 配置中的任何基本地址或明确定义的地址都将被忽略。而且不费吹灰之力地更改服务地址的布局不太可能 - 它们总是会成为 http://servername/virtualdirectory/YourService.svc(包括 .svc扩展名)。
自托管通常更快,因为您的ServiceHost已经在运行 - 但是由您负责确保它确实已经在运行,没有“按需”加载,也就是说无论何时消息到来,它要么启动并可以处理请求,要么不能。但是您对服务主机拥有更多的控制权 - 何时以及如何构造等,您可以选择并定义适合自己的服务地址。
我个人几乎总是选择使用自托管 - 在控制台应用程序中进行测试,在NT服务中进行生产。对我来说,这似乎是更适当的方式,也是更可控的方式。您需要做更多的工作 - 但您确切知道自己在做什么。
Marc
marc_s通常提供非常好的答案,我完全同意,但在这种情况下我不同意。
自托管WCF并不是一个好主意,特别是微软即将发布的Dublin技术。当WCF(和WF)应用程序托管在IIS内部时,其管理和操作要简单得多。
此外,您还可以获得按需加载。
IIS7.5(WS2008 R2)有一种始终运行的选项。
您还可以轻松进行URL重写以省略.svc文件扩展名。
有趣的小事->在阅读了这个线程后,我在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
<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绑定中,添加一个新的net.tcp绑定。在绑定配置中,设置端口和虚拟目录,例如
8001:*
此设置允许任何虚拟目录的所有连接都使用8001端口。
您还必须在服务器上安装“WCF Activation”功能(包括Http激活和非Http激活)。
IIS提供了许多开箱即用的功能,如应用程序域重新加载、监控等。
因此,您首先需要回答这些问题:您是否需要所有这些功能?如果不需要-可以考虑使用Windows服务。
虽然这里有选定的答案,但我允许自己发布一个问答主题链接。
你会在我的答案中找到(以及其中的链接)对服务主机进行精细控制的方法,无论你是在WService还是在IIS中加载它。
在服务启动时,您可以查询IIS它有哪些绑定并创建适当的端点。通过Microsoft.Web.Administration命名空间查找IIs配置。
希望这能有所帮助。