我们在Windows服务中托管了WCF服务,并且有一个访问该服务的非线程客户端。该服务正在执行对SQL Server 2008数据库的数据访问。间接地在客户端发生以下异常:
System.TimeoutException: The request channel timed out while waiting for a reply after 00:01:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.
我知道这个错误对于WCF问题来说可能是一个问题,但我确定错误没有发生,因为操作需要一分钟(我已经超时并且它仍然发生)。 / p>
多个端点上出现问题,并且在调用客户端代理时发生。我在崩溃发生时记录了服务到达的各个点的文本文件,并看到来自服务的return语句。
客户和服务已经以某种形式使用了两年以上,这个问题似乎只是在最近才发生,并且在对服务有重要意义的领域没有任何明显的变化(尽管这两个陈述都很难依赖于调试问题。)
任何有关调查的建议,想法或建议都将受到赞赏。
这是服务绑定:
<binding name="WSHttpBinding_IDataService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
这是客户端绑定:
<binding name="WSHttpBinding_IAssessmentDataAccessContract"
closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
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="Windows" proxyCredentialType="None" realm="">
<extendedProtectionPolicy policyEnforcement="Never"/>
</transport>
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true"/>
</security>
</binding>
答案 0 :(得分:1)
我遇到与连接到Oracle数据库的服务类似的问题。罪魁祸首花了我一些时间才找到,但我要采取的第一步是在服务器和客户端上启用跟踪。 Here is the MSDN doc on how to do that。 Jump to the recomended settings for tracing in production environment
听起来是数据库中的值为TYPE,WCF不知道如何序列化,或者它不包含在ServiceContract的KnownTypes属性中。当我遇到这个问题时,它非常相似,但是我需要深入研究这些跟踪,以发现在呼叫中没有正确地序列化(或反序列化)某些东西。我的问题是返回一个数据集而不是一个特定的值,更难找到确切的数据是罪魁祸首。
如果您没有自定义错误处理程序,WCF很容易锁定异常而您的客户端会“超时”。
答案 1 :(得分:1)
发生崩溃时,看到来自服务的return语句。
这有帮助,但并不意味着服务器端没有导致/增加问题。 是否有可能您的方法返回一个非常大的有效负载,下载或超过WCF绑定的最大大小需要太长时间?
现在,您可能直到现在才看到这个的原因是现在您有2年的数据,所以您可能会返回比初始时更多的东西。只是一个猜测。
例如
public string GetStuff()
{
return //large payload
}
两个结束时你的绑定是什么样的? maxStringContentLength
的价值是什么?