2

WindowsサービスでホストされているWCFサービスと、サービスにアクセスする単一の非スレッドクライアントがあります。このサービスは、SQLServer2008データベースへのデータアクセスを実行しています。クライアント側で断続的に次の例外が発生します。

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の問題のすべてを捕らえるのに少し役立つ可能性があることを認識していますが、操作に1分以上かかるため、エラーは発生していないと確信しています(タイムアウトを3倍にしましたが、まだ発生しています)。

この問題は複数のエンドポイントで発生し、クライアントプロキシへの呼び出しで発生します。クラッシュが発生したときにサービスが到達するさまざまなポイントをテキストファイルに記録し、サービスからのreturnステートメントに到達することを確認しました。

クライアントとサービスは2年以上何らかの形で使用されており、この問題はごく最近発生したようであり、サービスにとって重要な領域に明らかな変更はありません(ただし、これらのステートメントは両方とも、問題をデバッグするときに頼るのは危険です) )。

調査するためのアドバイス、考え、提案をいただければ幸いです。

サービスバインディングは次のとおりです。

<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

クラッシュが発生したときに、サービスからの return ステートメントに到達したことを確認します。

これは役に立ちますが、サーバー側が問題を引き起こしたり追加したりしていないという意味ではありません。メソッドが非常に大きなペイロードを返し、ダウンロードに時間がかかりすぎたり、WCF バインディングの最大サイズを超えたりする可能性はありますか?

今までこれを見たことがないかもしれない理由は、今では 2 年分のデータがあるため、最初に行ったよりも多くのものを返す可能性があるからです。推測です。

例えば

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

バインディングは両端でどのように見えますか? の値はmaxStringContentLength何ですか?

于 2012-10-18T13:25:22.177 に答える
1

Oracle データベースに接続するサービスでも同様の問題がありました。犯人を見つけるのに少し時間がかかりましたが、最初のステップは、サーバーとクライアントの両方でトレースを有効にすることでした。 その方法については、MSDN のドキュメントを参照してください本番環境でのトレースの推奨設定にジャンプします

データベースに値 TYPE があり、WCF がシリアル化する方法を認識していないか、ServiceContract の KnownTypes 属性に含まれていないようです。この問題に遭遇したときも非常に似ていましたが、トレースを掘り下げて、呼び出しで何かが正しくシリアル化 (または逆シリアル化) されていないことを発見する必要がありました。私の問題は、特定の値ではなくデータセットを返すことでした。どのデータが原因であるかを正確に見つけるのは困難でした。

カスタム エラー ハンドラーがない場合、WCF は例外でロックアップする傾向があり、クライアントは "タイムアウト" を取得します。

于 2012-10-18T13:12:05.123 に答える