间歇性WCF服务超时异常

时间:2012-10-18 09:58:04

标签: c# wcf

我们在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>

2 个答案:

答案 0 :(得分:1)

我遇到与连接到Oracle数据库的服务类似的问题。罪魁祸首花了我一些时间才找到,但我要采取的第一步是在服务器和客户端上启用跟踪。 Here is the MSDN doc on how to do thatJump 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的价值是什么?