可能看起来是一个愚蠢的问题,但 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>
在您的绑定配置中,您可以调整四个超时值:
<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”书:
您还花一些时间观看她的 15 部分“WCF 从上到下”截屏系列 - 强烈推荐!
有关更高级的主题,我建议您查看 Juwal Lowy 的 Programming WCF Services 书籍。
最好的方法是更改代码中所需的任何设置。
查看下面的示例:
using(WCFServiceClient client = new WCFServiceClient ())
{
client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
超时配置需要在客户端设置,所以我在web.config中设置的配置没有效果,WCF测试工具有自己的配置,需要在其中设置超时。
最近遇到了同样的错误,但能够通过确保关闭每个 wcf 客户端调用来修复它。 例如。
WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();
或
using(WCFServiceClient client = new WCFServiceClient ())
{
//More codes here
}
public static WebHttpBinding GetBinding()
{
var binding = new WebHttpBinding
{
ReceiveTimeout = TimeSpan.MaxValue,
SendTimeout = TimeSpan.MaxValue,
MaxBufferPoolSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
Security =
{
Mode = WebHttpSecurityMode.None,
Transport = {ClientCredentialType = HttpClientCredentialType.None}
},
//ProxyAddress = new Uri("", UriKind.Absolute),
UseDefaultWebProxy = false
};
return binding;
}