2

我们有一个托管在 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 问题可能有点笼统,但我确信错误没有发生,因为操作需要一分钟以上(我已经将超时增加了三倍,但它仍然会发生)。

该问题发生在多个端点上,并且发生在对客户端代理的调用上。我将崩溃发生时服务到达的各个点记录到一个文本文件中,并看到服务的返回语句已到达。

客户端和服务已经以某种形式使用了两年多,这个问题似乎只是最近才发生,并且在对服务重要的领域没有任何明显的变化(尽管在调试问题时依赖这两个陈述都是危险的)。

任何关于调查的建议、想法或建议将不胜感激。

这是服务绑定:

<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>
4

2 回答 2

1

我对连接到 Oracle 数据库的服务也有类似的问题。我花了一些时间才找到罪魁祸首,但我要做的第一步是在服务器和客户端上启用跟踪。 这是有关如何执行此操作的 MSDN 文档跳转到生产环境中跟踪的推荐设置

听起来像是您在数据库中有一个 WCF 不知道如何序列化的值 TYPE,或者它不包含在您的 ServiceContract 的 KnownTypes 属性中。当我遇到这个问题时,它非常相似,但我需要挖掘跟踪以发现调用中的某些内容没有被正确序列化(或反序列化)。我的问题是返回数据集而不是特定值,很难准确找到罪魁祸首的数据。

如果您没有自定义错误处理程序,WCF 很容易锁定异常并且您的客户端会获得“超时”。

于 2012-10-18T13:12:05.123 回答
1

当崩溃发生时,看到服务的返回语句已经到达。

这有帮助,但并不意味着服务器端不会导致/添加问题。您的方法是否可能返回一个非常大的有效负载并且下载时间过长或超过 WCF 绑定的最大大小?

现在,您可能直到现在才看到这一点的原因是现在您拥有 2 年的数据,因此您返回的内容可能比最初更多。只是一个猜测。

例如

public string GetStuff()
{
     return //large payload
} 

两端的绑定是什么样的?W 的价值是maxStringContentLength多少?

于 2012-10-18T13:25:22.177 回答