IIS WCF服务托管与Windows服务对比

44
我们开发了一个WCF服务,现在需要部署它。我们的客户将使用 basicHttpBinding, 而我们的内部团队将使用namedPipesBinding
我们想知道是在 IIS 7 中托管更好还是使用 Windows Service。我们进行了一些测试,发现当我们在IIS中添加绑定时,它不会更新服务的配置文件。这意味着我们需要在两个不同的地方维护配置,这是不合逻辑的,对吧?
我们还在 StackOverflow 上读到过这样一句话:当WCF服务在IIS中托管时,基地址会被忽略。详见有关<baseAddresses>的WCF服务配置文件问题

1
这总是取决于上下文。根据微软的说法,“在企业场景下,你不应考虑自托管。自托管适用于企业项目开发或演示阶段。” https://msdn.microsoft.com/en-us/library/bb332338.aspx - Jayee
7个回答

75

IIS托管具有许多优点和缺点。

是的,IIS为您提供按需加载 - 这可能是一个优点或缺点。当请求到达时,ServiceHost被构建,然后实例化正在托管的服务类,并处理请求。没有必要全天候运行。但同时,这种设置需要更多的时间和精力每次消息到来时,您作为程序员对您的服务主机没有太多控制权。

而且,使用IIS时,*.svc文件所在的虚拟目录定义了您的地址 - 配置中的任何基本地址或明确定义的地址都将被忽略。而且不费吹灰之力地更改服务地址的布局不太可能 - 它们总是会成为 http://servername/virtualdirectory/YourService.svc(包括 .svc扩展名)。

自托管通常更快,因为您的ServiceHost已经在运行 - 但是由您负责确保它确实已经在运行,没有“按需”加载,也就是说无论何时消息到来,它要么启动并可以处理请求,要么不能。但是您对服务主机拥有更多的控制权 - 何时以及如何构造等,您可以选择并定义适合自己的服务地址。

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

Marc


这正是我一直在寻找的,但我想知道是否有工具可以管理自托管的WCF服务?实际上,将其托管在IIS中的主要目的是提供一个用户友好的工具来配置我们的服务。 - esylvestre
1
"Dublin" 可能是我期望的工具。 - esylvestre
WCF的管理故事目前并不出色 - 微软承诺将在“都柏林”(.NET 4.0之后的服务器附加组件)中提供更多工具支持 - marc_s

26

marc_s通常提供非常好的答案,我完全同意,但在这种情况下我不同意。

自托管WCF并不是一个好主意,特别是微软即将发布的Dublin技术。当WCF(和WF)应用程序托管在IIS内部时,其管理和操作要简单得多。

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

IIS7.5(WS2008 R2)有一种始终运行的选项。

您还可以轻松进行URL重写以省略.svc文件扩展名。


5
我完全同意,而且你可以创建自定义的ServiceHostFactory来更好地控制你的ServiceHost。 - Piotr Owsiak
同时,通过IIS管理SSL证书和HTTP端口绑定也更加“容易”。 - Dasith Wijes
4
最近的一个例子是,在IIS中托管相同的net.tcp消息日志记录服务比在Windows服务中“自我”托管相同的服务,消耗3倍的内存并处理一半的请求数。 - StingyJack
1
哇,@StingyJack,这是好信息。你用的是哪个版本的Windows Server? - Cheeso
主要是Windows 7专业版,但也有一些Windows 10和2012服务器(通常的目标更像是“设备”而不是通用服务器)。它仍然可能是一个我没有发现的导致IIS变慢的配置设置。我确实觉得很难相信它无法跟上自托管的请求数量。 - StingyJack

16

有趣的小事->在阅读了这个线程后,我在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


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高级设置中,您需要设置启用的协议为http和net.tcp。

然后,在IIS绑定中,添加一个新的net.tcp绑定。在绑定配置中,设置端口和虚拟目录,例如

8001:*

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

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


HTTP绑定是否也需要与net.tcp一起存在。如果我只有net.tcp绑定,服务是否会被激活? - user55474

8

引用自托管的缺点:功能有限:自托管应用程序对高可用性、易管理性、强健性、可恢复性、版本控制和部署方案的支持有限。至少,开箱即用的WCF不提供这些功能,因此在自托管场景中,您必须自己实现这些功能;例如,IIS默认情况下带有其中几个功能。微软表示,正是出于这些原因,自托管不是服务的企业解决方案。请参见此处的比较:https://msdn.microsoft.com/en-us/library/ms730158.aspx - Dasith Wijes

5

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

因此,您首先需要回答这些问题:您是否需要所有这些功能?如果不需要-可以考虑使用Windows服务。


1
你是对的,但在问自己这些问题之前,我想需要知道我的服务的初始配置(绑定)是否可以由IIS管理。 - esylvestre

0

虽然这里有选定的答案,但我允许自己发布一个问答主题链接。

如何在IIS中托管时从代码配置WCF服务?

你会在我的答案中找到(以及其中的链接)对服务主机进行精细控制的方法,无论你是在WService还是在IIS中加载它。

在服务启动时,您可以查询IIS它有哪些绑定并创建适当的端点。通过Microsoft.Web.Administration命名空间查找IIs配置。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接