WCF服务,如何增加超时?

Posted

技术标签:

【中文标题】WCF服务,如何增加超时?【英文标题】:WCF Service , how to increase the timeout? 【发布时间】:2010-12-03 23:10:51 【问题描述】:

这似乎是一个愚蠢的问题,但 WCF 中的所有内容似乎都比 asmx 中复杂得多,如何增加 svc 服务的超时时间?

这是我目前所拥有的:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

然后我的端点被映射如下:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

我得到的确切错误:

请求通道在 00:00:59.9990000 之后等待回复时超时。增加传递给 Request 调用的超时值或增加 Binding 上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。

在 WCF 测试客户端中,有一个配置图标,其中包含我的服务的运行时配置:

如您所见,它的值与我为它设置的值不同吗?我做错了什么?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" 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="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

【问题讨论】:

【参考方案1】:

在您的绑定配置中,您可以调整四个超时值:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

最重要的是sendTimeout,它表示客户端将等待来自 WCF 服务的响应的时间。您可以在设置中指定hours:minutes:seconds - 在我的示例中,我将超时设置为 25 分钟。

顾名思义,openTimeout 是您在打开与 WCF 服务的连接时愿意等待的时间。同样,closeTimeout 是您关闭连接(释放客户端代理)后在引发异常之前等待的时间。

receiveTimeout 有点像sendTimeout 的镜像——发送超时是您等待服务器响应的时间,receiveTimeout 是您等待的时间。会给你客户端接收和处理来自服务器的响应。

如果您来回发送“正常”消息,两者都可能非常短——尤其是receiveTimeout,因为接收 SOAP 消息、解密、检查和反序列化几乎不需要时间。流式传输的情况有所不同 - 在这种情况下,您可能需要在客户端上花费更多时间才能真正完成从服务器返回的流的“下载”。

还有 openTimeout、receiveTimeout 和 closeTimeout。 MSDN docs on binding 为您提供有关这些用途的更多信息。

要认真掌握 WCF 的所有复杂功能,我强烈建议您购买 Michele Leroux Bustamante 的“Learning WCF”一书:

Learning WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

您还花一些时间观看她的 15 集“WCF Top to Bottom”截屏系列 - 强烈推荐!

有关更高级的主题,我建议您查看 Juwal Lowy 的 Programming WCF 服务书籍。

Programming WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

【讨论】:

我尝试将绑定部分添加到 web.config 中的 中,但现在它抛出了一个错误......我错过了任何其他步骤...... 我还将服务中的端点更改为 我想我明白了 - binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout" 完全正确 - 绑定是您使用的协议类型 - basicHttp、wsHttp、netTcp。绑定 configuration 是您在 config 中创建的用于修改超时等的配置。 有趣的是,即使这样做了,仍然出现超时错误,Marc 你能提供尽可能多的信息吗?【参考方案2】:

最好的方法是更改​​代码中所需的任何设置。

看看下面的例子:

using(WCFServiceClient client = new WCFServiceClient ())
 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);

【讨论】:

这是一个更好的解决方案,而不是更新配置,这样我就可以为不同的呼叫和服务配置不同的值,非常感谢【参考方案3】:

超时配置需要在客户端设置,所以我在web.config中设置的配置没有效果,WCF测试工具有自己的配置,有需要设置超时的地方。

【讨论】:

嗯,是的 - 通常,它必须在客户端和服务器上都设置,甚至 - 例如在会话和类似的事情上出现“inactivityTimeout”的情况。 JL:你能证明你做了什么吗?我也有同样的问题 如果您使用“WCF 测试客户端”,请右键单击服务树中的“配置文件”,然后单击“使用 SvcConfigEditor 编辑”并更改绑定中的超时时间。【参考方案4】:

最近遇到了同样的错误,但能够通过确保关闭每个 wcf 客户端调用来修复它。 例如。

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

using(WCFServiceClient client = new WCFServiceClient ())
 
    //More codes here 

【讨论】:

不要使用“使用”方法:omaralzabir.com/do-not-use-using-in-wcf-client 在omaralzabir.com/do-not-use-using-in-wcf-client 的cmets 中,有一些示例说明如何在不处理故障通道对象的情况下仍使用using。这是另一位博主,其方法与using 块更兼容:erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper。

以上是关于WCF服务,如何增加超时?的主要内容,如果未能解决你的问题,请参考以下文章

超时 WCF 服务

在 app.config 文件中配置 wcf 超时 [重复]

如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题

为啥 WCF 不支持服务端超时?

异步 WCF 服务超时

WCF 服务超时