【问题标题】:How to set keep alive interval for HTTP connection in WCF如何在 WCF 中为 HTTP 连接设置保持活动间隔
【发布时间】:2011-03-28 20:18:27
【问题描述】:

默认情况下,WCF 中的 Http 传输通道使用持久 HTTP 连接。如何控制这些连接的保持活动超时?默认值为 100 秒。我通过监视 Procmon 中的应用程序发现了这个价值。我在配置此超时的 http 传输绑定元素中没有找到任何设置。是否有任何 .NET 类可以控制该超时?

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    【讨论】:

    • 感谢您的帖子,但这并不能回答问题。问题不是关于关闭保持活动,而是关于设置保持活动超时。所以我想让保持活动打开,我想控制它的持续时间。
    【解决方案2】:

    我找到了解决方案。问题是底层内核 http.sys 有它自己的超时,它会中断连接。

    http://mmmreddy.wordpress.com/2013/07/11/wcf-use-of-http-transport-sharing-persistent-tcp-sessions/
    
    netsh http add timeout timeouttype=idleconnectiontimeout value=120
    

    另外,这个问题和What 130 second timeout is killig my WCF streaming service call?类似

    【讨论】:

      【解决方案3】:

      在我看来,您想要调整 Keep-Alive HTTP 标头。您应该阅读关于 HTTP keep-alive 的 this article,并首先确定这是否真的值得您花时间。

      如果是,请尝试创建Message Inspector。这应该允许您修改发送出去的每条消息的 HTTP 标头:

      public class KeepAliveMessageInspector : IClientMessageInspector
      {
          // ...
      
          public object BeforeSendRequest(
              ref System.ServiceModel.Channels.Message request,
              System.ServiceModel.IClientChannel channel)
          {
              // Add/modify the Keep-Alive header
              var httpRequestMessage = new HttpRequestMessageProperty();
              httpRequestMessage.Headers.Add("Keep-Alive", "9000");
              request.Properties.Add(
                  HttpRequestMessageProperty.Name, httpRequestMessage);
              return null;
          }
      
          // ...
      }
      

      【讨论】:

      • 这个想法很有趣。我在与 Cassini 的通信中看到了类似的东西,但我认为它不是标准标题。无论如何,我会在接下来的几天里尝试一下。如果可行,我将设置新的赏金并奖励你。
      • 顺便说一句。我不需要使用它。我只是想知道是否可以以某种方式更改它以及默认值 100s 的来源。
      • @Ladislav Mrnka : 很抱歉把这篇旧帖子删掉了,但是您是否能够设置或读取这个 HTTP 保持活动值。如果是的话,我会很想知道更多关于它的信息。谢谢
      • io.com/~maus/HttpKeepAlive.html 未找到 404 错误url 损坏
      【解决方案4】:

      设置 ServicePoint.MaxIdleTime 应该可以让您更改持久 HTTP 连接的默认 100 秒空闲超时。

      https://www.visualbasicplanet.info/windows-communication/configuring-http-connections.html

      【讨论】:

        【解决方案5】:

        this answer 和我可以读到的here,您似乎想创建一个自定义http 绑定,并设置inactivityTimeout 属性。

        来自 MSDN 文章:

        <bindings>
          <customBinding>
            <binding name="Binding1">
              <reliableSession acknowledgementInterval="00:00:00.2000000" enableFlowControl="true"
                                maxTransferWindowSize="32" inactivityTimeout="00:10:00" maxPendingChannels="128"
                                maxRetryCount="8" ordered="true" />
              <security mode="None"/>
              <httpTransport authenticationScheme="Anonymous" bypassProxyOnLocal="false"
                            hostNameComparisonMode="StrongWildcard" 
                            proxyAuthenticationScheme="Anonymous" realm="" 
                            useDefaultWebProxy="true" />
            </binding>
          </customBinding>
        </bindings>
        

        【讨论】:

        • 没有。我想设置 HTTP 保持活动而不是可靠会话保持活动。 HTTP 保持活动在 HTTP 协议规范中进行了描述。
        • 根据 RFC 2616 (w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.1),似乎 HTTP 连接应该始终保持不变。
        • 我不这么认为。 RFC 说 HTTP 实现应该实现 HTTP 持久连接。并不是说应该只使用持久连接。
        【解决方案6】:

        这个怎么样?似乎它可能是您的 IIS 服务器的功能,与 WCF 服务无关?我知道这个链接适用于 IIS6,但也许它可以作为 IIS7 中类似内容的基础? http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/73566f83-c257-4941-8ed8-7ae45b2e7985.mspx?mfr=true

        【讨论】:

        • 我已经尝试在 IIS 上设置连接超时,但没有成功。它与保持活动设置无关。无论如何,我会在接下来的几天里再试一次。如果可行,我将设置新的赏金并奖励你。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2013-02-18
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        相关资源
        最近更新 更多