【问题标题】:IIS WCF service hosting vs Windows ServiceIIS WCF 服务托管与 Windows 服务
【发布时间】:2009-10-13 14:33:47
【问题描述】:

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

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

我们还在 StackOverflow 上读到,当 WCF 服务在 IIS 中托管时,基地址会被忽略(请参阅 WCF service configuration file question regarding <baseAddresses>

【问题讨论】:

标签: c# .net wcf iis was


【解决方案1】:

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

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

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

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

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

马克

【讨论】:

  • 这正是我一直在寻找的,但我想知道是否有工具可以在自托管 WCF 服务时对其进行管理?实际上,在 IIS 中托管它的主要目的是提供一个用户友好的工具来配置我们的服务。
  • "Dublin" 可能是我期待的工具。非常感谢。
  • WCF 的管理故事现在并不精彩 - 微软承诺通过“Dublin”提供更多工具支持(服务器插件将在 .NET 4.0 之后的某个时间发布)
【解决方案2】:

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

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

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

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

【讨论】:

  • 我完全同意,另外你可以创建一个自定义的 ServiceHostFactory 来更好地控制你的 ServiceHost。
  • 通过 IIS 管理 SSL 证书和 htttp 端口绑定也“更容易”。
  • 作为最近的轶事示例,在 IIS 中托管相同的 net.tcp 消息日志记录服务消耗的内存增加了 3 倍,并且处理的请求数量是在 Windows 中托管相同服务的“self”时的 1/2服务。
  • 哇@StingyJack 这是很好的信息。什么版本的 Windows Server?
  • 主要是 windows 7 pro,但也有一些 windows 10 和 2012 服务器(通常的目标是“设备”而不是通用服务器)。它仍然可能是一个配置设置,它使我没有找到的 IIS 陷入困境。我确实很难相信它无法跟上自主机的请求数。
【解决方案3】:

有趣的花絮-> 阅读此线程后,我在 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

【讨论】:

    【解决方案4】:

    回答这些问题:

    我们进行了一些测试,我们发现 当我们添加绑定时 IIS,它不更新配置文件 我们的服务。这意味着我们将 需要维护配置 两个不同的地方。这不是逻辑, 对吧?

    当您使用 IIS 托管您的服务时,您必须配置您的 App.config 文件或 web.config 文件以允许 IIS 公开一些绑定,因此在您的配置文件中,您将把您允许的所有绑定放到您的 wcf服务。 Http、net.tcp 等...

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

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

    您将直接在 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 激活)”功能。

    【讨论】:

    • http绑定是否也需要与net.tcp一起存在。如果我在绑定中只有 net.tcp 将被激活服务
    【解决方案5】:

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

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

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

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

    【讨论】:

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

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

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

    【讨论】:

    • 你是对的,但在问自己这些问题之前,我想知道我的服务的初始配置(绑定)是否可以由 IIS 管理。
    【解决方案7】:

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

    How to configure WCF service from code when hosted in IIS?

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 2022-12-13
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多