WCF 显示超时错误
Posted
技术标签:
【中文标题】WCF 显示超时错误【英文标题】:WCF showing timeout error 【发布时间】:2011-05-23 20:43:06 【问题描述】:我刚刚创建了一个 WCF 服务库。我创建了一个测试函数,并从 WCF 测试客户端调用了该测试函数。我在代码中设置了一个断点。控制到达断点并停在那里。现在我让控件在断点处停留一段时间,大约一分钟后得到以下错误消息
"调用服务失败。可能的原因:服务下线或无法访问;客户端配置与代理不匹配;现有代理无效。详细请参考堆栈跟踪。您可以尝试通过启动新代理、恢复到默认配置或刷新服务来恢复。”
错误详情: 00:00:59.9843750 后等待回复时请求通道超时。增加传递给 Request 调用的超时值或增加 Binding 上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。
服务器堆栈跟踪:
在 System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan 超时)
在 System.ServiceModel.Channels.ClientReliableChannelBinder1.RequestClientReliableChannelBinder
1.OnRequest(TRequestChannel 通道,消息消息,TimeSpan 超时,MaskingMode maskingMode)
在 System.ServiceModel.Channels.ClientReliableChannelBinder1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode)
at System.ServiceModel.Channels.ClientReliableChannelBinder
1.Request(消息消息,TimeSpan 超时)
在 System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(消息消息,TimeSpan 超时)
在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan 超时)
在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时)
在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出)
在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime 操作)
在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)
在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 ITrustmarkService.StartRobotProcess() 在 TrustmarkServiceClient.StartRobotProcess()
知道是什么原因造成的吗?
【问题讨论】:
【参考方案1】:这是来自MSDN 的示例 WCF 客户端配置:
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
您应该将receiveTimeout
和sendtimout
设置为适当的值,您可以在测试的配置文件中看到类似的配置。
【讨论】:
@Sidharth 要完全正确,您需要同时设置binding.receiveTimeout 和binding.ReliableSession.InactivityTimeout,因为这两个到期中的任何一个都会关闭连接。这两个设置都可以在 .config 文件中更改,如上所述,或者在代码中。【参考方案2】:是的。默认情况下,WCF 服务配置了 1 分钟的响应超时。这意味着客户最多可以等待一分钟,如果他们在那段时间内没有得到响应,他们可以假设失败/没有响应。
在您的情况下,您使用断点持有 WCF 服务来响应客户端的请求。等待一分钟后,客户端超时,不再等待。
您可以从 WCF 服务的 .config 文件中增加此超时时间。
【讨论】:
你能告诉我在 .config 文件中哪里可以更改吗? ***.com/questions/424358/…以上是关于WCF 显示超时错误的主要内容,如果未能解决你的问题,请参考以下文章