WCF服务,如何增加超时?
可能看起来像一个愚蠢的问题,但在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>
然后我的terminal被映射如下:
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout" contract="ServiceLibrary.IDownloads"> <identity> <dns value="localhost" /> </identity> </endpoint>
我得到确切的错误:
请求通道在00:00:59.9990000之后等待回复时超时。 增加传递给请求调用的超时值或增加绑定上的SendTimeout值。 分配给此操作的时间可能是更长时间的一部分。
在WCFtesting客户端中,有一个configuration图标,其中包含我的服务的运行时configuration:
你可以看到它与我所设定的值不一样吗? 我究竟做错了什么?
<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>
在你的绑定configuration中,有四个你可以调整的超时值:
<bindings> <basicHttpBinding> <binding name="IncreasedTimeout" sendTimeout="00:25:00"> </binding> </basicHttpBinding>
最重要的是sendTimeout
,它表示客户端等待WCF服务响应的时间。 您可以在设置中指定hours:minutes:seconds
– 在我的示例中,我将超时设置为25分钟。
顾名思义, openTimeout
是您打开与WCF服务的连接时所愿意等待的时间。 同样, closeTimeout
是closures连接(处置客户端代理)的时间量,您将在抛出exception之前等待。
receiveTimeout
有点像receiveTimeout
的镜像 – 而发送超时是等待服务器响应的时间, receiveTimeout
是你给客户端接收和处理数据的时间来自服务器的响应。
如果你发送“普通”消息,两者都可能非常短 – 特别是receiveTimeout
,因为接收SOAP消息,解密,检查和反序列化应该几乎没有时间。 这个故事与stream媒体不同 – 在这种情况下,您可能需要更多时间在客户端上实际完成从服务器获取的stream的“下载”。
还有openTimeout,receiveTimeout和closeTimeout。 有关绑定的MSDN文档为您提供了有关这些内容的更多信息。
为了认真掌握WCF的所有细节,我强烈build议您购买Michele Leroux Bustamante的“ Learning WCF ”一书:
你也花一些时间看她的15部分“ WCF顶部到底部 ”截屏video系列 – 强烈推荐!
对于更高级的主题,我build议你查阅Juwal Lowy的编程WCF服务书。
超时configuration需要在客户端级别进行设置,所以我在web.config中设置的configuration没有任何作用,WCFtesting工具有它自己的configuration,并且有需要设置超时的地方。
最好的方法是在你的代码中改变你想要的任何设置。
看看下面的例子:
using(WCFServiceClient client = new WCFServiceClient ()) { client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30); }
最近得到了同样的错误,但能够通过确保closures每个wcf客户端调用来修复它。 例如。
WCFServiceClient client = new WCFServiceClient (); //More codes here // Always close the client. client.Close();
要么
using(WCFServiceClient client = new WCFServiceClient ()) { //More codes here }