WCF服务,如何增加超时时间?


93

也许这似乎是一个愚蠢的问题,但是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之后等待答复时超时。增加传递给请求的调用的超时值,或者增加绑定上的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>

Answers:


179

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

<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文档为您提供了有关这些功能的更多信息。

为了认真掌握WCF的所有复杂性,我强烈建议您购买Michele Leroux Bustamante 的“ 学习WCF ”书:

学习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从上到下 ”屏幕录像系列-强烈推荐!

有关更高级的主题,建议您阅读Juwal Lowy的《WCF编程》一书。

编程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中的<system.serviceModel>中,但是它现在引发错误....我错过的任何其他步骤...
JL。

我还将服务中的端点更改为<endpoint address =“” binding =“ IncreasedTimeout”-这是做错的事情吗?
JL。

我想我明白了-binding =“ basicHttpBinding” bindingConfiguration =“ IncreasedTimeout”
JL。

确切地说-绑定是您使用的协议类型-basicHttp,wsHttp,netTcp。绑定配置是这样的配置您在配置创建修改超时等
marc_s

即使这样做仍然很有趣,但仍然出现超时错误,Marc您能否提供尽可能多的信息?
JL。

27

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

查看以下示例:

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

这是一个更好的解决方案,而不是更新配置,所以我可以为不同的呼叫和服务配置不同的值,非常感谢
Salim

26

需要在客户端级别设置超时配置,因此我在web.config中设置的配置无效,WCF测试工具具有自己的配置,您需要在此处设置超时。


1
好吧,是的-通常,它甚至必须在客户端和服务器上都进行设置,例如-在会话等“ inactivityTimeout”的情况下。
marc_s

8
JL:您能证明自己做了什么吗?我遇到了同样的问题
Nick Kahn 2012年

如果您使用的是“ WCF测试客户端”,请在服务树中右键单击“配置文件”,然后单击“使用SvcConfigEditor编辑”并更改绑定内的超时。
Radderz

4

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

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

要么

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

10

omaralzabir.com/do-not-use-using-in-wcf-client的注释中,有一些示例,说明了如何using在不处理有故障的通道对象的情况下仍然使用。这是另一个使用与using块更兼容的方法的博客: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper
格雷格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.