【问题标题】:why WCF service stop working every 20 mins?为什么 WCF 服务每 20 分钟停止一次工作?
【发布时间】:2011-04-21 01:43:51
【问题描述】:

我是 wcf 和多线程的新手,我编写了一个托管在 IIS7 中的 wcf 服务,在这个服务中有一个长时间运行的任务 (System.Threading.Tasks.Task),它可能会运行 20 小时.

但是这个 wcf 服务总是每 20 分钟停止一次工作。

当 application_stop 和 application_start 运行时,我让 wcf 向我发送电子邮件。因此,当它开始运行时,我收到一封电子邮件,然后在 20 分钟后,我收到电子邮件显示服务停止。

我真的不明白为什么会发生这种情况,为什么服务每 20 分钟就会停止工作。

wcf 服务是每 20 分钟停止一次,还是 Task 线程每 20 分钟停止一次?

IIS7 的任何配置都会影响 wcf 运行时间吗?

我尝试将 receiveTimeout 设置为一个大的时间量,并使用 asych 调用在客户端调用 wcf,但这没有帮助。

伙计们,我真的需要帮助,非常感谢。

以下代码属于调用此 wcf 服务的网站

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IMailingService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="24.20:31:23.6470000" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:92/MailingService.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IMailingService" contract="MalingService.IMailingService"
        name="BasicHttpBinding_IMailingService" />
    </client>
  </system.serviceModel>

【问题讨论】:

    标签: multithreading wcf


    【解决方案1】:

    IIS 应用程序池空闲默认超时为 20 分钟。您可以通过以下步骤配置应用程序池空闲超时,我从这篇文章中挑选 - http://technet.microsoft.com/en-us/library/cc771956(WS.10).aspx

    • 打开 IIS 管理器。
    • 展开服务器节点并单击应用程序池。
    • 在“应用程序池”页面上,选择要为其指定空闲超时设置的应用程序池,然后单击“操作”窗格中的“高级设置”。
    • 在空闲超时(分钟)框中,输入分钟数,然后单击确定。

    正如 rerun 所说,IIS 主机不是最适合您的方案,Windows 服务上的 WAS 会是更好的选择。

    【讨论】:

    • 感谢 Sachin,如果 wcf 服务在 5 分钟后停止,我尝试将空闲时间设置为 5 分钟。
    • 感谢 Sachin,我将空闲时间更改为 0 以使此 wcf 服务保持运行。我知道这不是这种情况下的理想解决方案。但我目前不得不选择这种方法。我计划将来将其移至 Windows 服务中。但是如何让一个网站调用这个windows服务呢?你对此有什么想法吗?谢谢。
    • 应用程序池的这种和其他“副作用”是我始终建议自己在受控的 Windows NT 服务中托管生产级 WCF 服务的一些原因。
    • @jeff chen 您可以以非常相似的方式托管 wcf 服务。请参阅链接 - msdn.microsoft.com/en-us/library/ms733069.aspx 示例
    【解决方案2】:

    IIS 不适合托管长时间运行的任务。如果正好是 20 分钟,我会认为 iis 正在关闭所有者线程,但这是猜测。我真的建议转移到 Windows 服务 wcf 托管环境。

    【讨论】:

    • thnaks 重新运行。但是如果我把这个wcf服务托管到windows服务中,网站怎么调用这个服务呢?
    • 完全一样。主机独立于它如何使自己对其他主机可用
    【解决方案3】:

    我使用廉价的 cron 作业服务服务每 5 分钟在我的应用程序上运行一次处理程序。这有助于保持游泳池的活力。如果您不想离开 IIS,这是一个快速且“肮脏”的修复方法。

    【讨论】:

    • 感谢 NovaJob,我之前也有这个想法,:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多