45

我们开发了 WCF 服务,并且正在寻求部署它。我们的客户将使用它,basicHttpBinding但我们的内部团队将使用它namedPipesBinding

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

我们还在 StackOverflow 上读到,当 WCF 服务在 IIS 中托管时,基地址将被忽略(请参阅有关 <baseAddresses> 的 WCF 服务配置文件问题

4

7 回答 7

76

在 IIS 中托管有很多优点和缺点。

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

是的,对于 IIS,*.svc 文件所在的虚拟目录定义了您的地址 - 配置中的任何基地址或明确定义的地址都将被忽略。无需太多努力,您就无法更改服务地址的布局——它们总是http://servername/virtualdirectory/YourService.svc(包括 .svc 扩展名)。

自托管通常快几倍,因为您的 ServiceHost 已经启动并运行 - 但您需要确保它确实启动并运行,每当消息进入时都没有“按需”加载 - 无论是启动还是是否可以服务请求。但是您对服务主机有更多的控制权——何时以及如何构建它等,并且您可以根据需要选择和定义您的服务地址。

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

马克

于 2009-10-13T14:59:21.643 回答
26

marc_s 通常会给出我完全同意的很好的答案,但在这种情况下我不同意。
WCF 的自托管不是一个好主意,尤其是在 Microsoft 即将发布的 Dublin 技术的情况下。当托管在 IIS 中时,WCF(和 WF)应用程序的管理和操作要简单得多。

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

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

如果这让您感到困扰,您可以轻松地进行 URL 重写以省略 .svc。

于 2009-10-14T09:17:11.523 回答
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

于 2011-05-10T20:48:47.123 回答
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。将您的绑定为 http normaly 并添加一个新的绑定 net.tcp,在绑定配置中放置端口和虚拟目录,如

8001:*

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

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

于 2009-10-14T13:56:40.907 回答
7

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

请检查以下链接:(http://msdn.microsoft.com/en-us/library/ms730158.aspx、http://msdn.microsoft.com/en-us/library/bb332338.aspx)并考虑您约束:

  • 操作系统
  • 预期表现
  • 可用硬件
  • 预期可用性

您会发现在许多情况下“自托管”是最好的选择。

于 2012-12-04T11:00:38.100 回答
5

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

这就是为什么您应该首先回答这个问题:您是否需要所有这些功能?如果没有 - 可以考虑 windows 服务。

于 2009-10-13T14:45:47.043 回答
0

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

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

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

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

希望这个对你有帮助。

于 2013-01-23T08:10:31.940 回答