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 ”一书:

学习WCF http://ecx.images-amazon.comhttp://img.dovov.comI/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

你也花一些时间看她的15部分“ WCF顶部到底部 ”截屏video系列 – 强烈推荐!

对于更高级的主题,我build议你查阅Juwal Lowy的编程WCF服务书。

编程WCF http://ecx.images-amazon.comhttp://img.dovov.comI/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

超时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 }