WCF 超时问题?
Posted
技术标签:
【中文标题】WCF 超时问题?【英文标题】:WCF Timeout issue? 【发布时间】:2011-06-19 00:44:48 【问题描述】:我有一个耗时较长的基于 WCF 的流程。如果有任何帮助,WCF 服务将在 Azure 中运行。我认为这个问题与超时有关:
1) Winforms 客户端在绑定部分有如下 .config 设置:
<wsHttpBinding>
<binding name="XXX" closeTimeout="00:05:00" openTimeout="00:05:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false"
transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="10000000" maxReceivedMessageSize="10000000"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="255" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
2) WCF 服务在 web.config 中有以下绑定部分
<wsHttpBinding>
<binding name="XXX" maxReceivedMessageSize="10000000" sendTimeout="00:10:00" receiveTimeout="00:10:00" closeTimeout="00:10:00" openTimeout="00:10:00">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" establishSecurityContext="false" />
</security>
<readerQuotas maxArrayLength="2000000" maxBytesPerRead="10000000" maxStringContentLength="10000000" maxDepth="255" />
</binding>
</wsHttpBinding>
3) 我在 WCF 中有一种长时间运行的方法(通常为 2 分钟)。客户端调用该方法,那些执行时间超过 1 分钟的将被抛出异常。这是最内在的例外:
<InnerException>
<Type>System.Net.Sockets.SocketException</Type>
<Message>An existing connection was forcibly closed by the remote host</Message>
<StackTrace>
<Frame>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)</Frame>
</StackTrace>
</InnerException>
</InnerException>
4) WCF 调用本身已成功完成,但是(我在服务器端都登录了 Start/End)。如何避免异常?
谢谢!
【问题讨论】:
只要运行超过一分钟,它就会返回该错误。错误会在一分钟后准确地返回给客户端。但是,服务器仍在完成方法调用。 【参考方案1】:Windows Azure 负载平衡器在 60 秒后终止空闲连接。
【讨论】:
史蒂夫,哇,完全不知道这个……有没有办法延长超时时间?有些通话可能需要 1 分钟以上才能完成! 有趣。 Steve 有没有办法修改这种行为,或者是否打算通过队列或其他跨任务方法将长时间运行的作业外包给工作者角色? 目前无法更改。但是,如果您可以通过 TCP 连接定期发送数据,它将保持打开状态。 (只有 idle 连接会被终止。) 是否有计划在未来使其可配置?如果有计划,任何想法可能可用,例如下一个版本...或者最多到明年年底...或者根本不在路线图上...只是一些迹象会有所帮助:-) Steve,如果这方面有什么变化,请提出建议。或者可能可以为该功能创建某种请求以控制/增加该超时?通常,通过调用一些虚拟方法来保持连接处于活动状态不是问题,但在某些情况下这是不可能的 - 假设我有 3-rd 方服务允许我发送一个 HTTP POST 请求并处理结果(它支持一些脚本发生时不允许处理连接终止的语言),因此目前整个过程都失败了。希望你能看到这条消息。【参考方案2】:查看 Azure 团队的最新帖子...http://azure.microsoft.com/blog/2014/08/14/new-configurable-idle-timeout-for-azure-load-balancer/
【讨论】:
【参考方案3】:更新答案:
Azure 负载平衡器在 4 分钟后终止空闲连接。如果您对增加/减少超时值感兴趣,请查看这篇文章:
https://azure.microsoft.com/en-us/blog/new-configurable-idle-timeout-for-azure-load-balancer/
【讨论】:
以上是关于WCF 超时问题?的主要内容,如果未能解决你的问题,请参考以下文章