0

メッセージ暗号化で wsHttpBinding を使用する WCF サービスがあります。障害が発生しない限り、同じサービス参照を使用します。障害が発生した場合は、新しいサービス参照を作成します。セッションがタイムアウトし、サービスが終了したのに、クライアント アプリケーションの CommunicationState が Opened のままであるという問題が発生しています。

接続がタイムアウトしたかどうかを ClientBase で確認するにはどうすればよいですか? 現在のサービス プロキシがタイムアウトした場合に、クライアント アプリケーションで新しいサービス プロキシを作成したいと考えています。

以下は私のクライアント側バインディングです:

  <wsHttpBinding>
    <binding name="wsHttpBindingWithAuthClient" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxReceivedMessageSize="20000000"
      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="" />
        <message clientCredentialType="UserName" negotiateServiceCredential="true"
          algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
4

2 に答える 2

2

すべてのサービス呼び出しを try/catch でラップし、サーバー接続タイムアウトの特定の例外タイプの catch ブロックで、プロキシを再作成してみませんか。

try
{
  serviceProxyGlobal.Method()
}
catch(WhateverServerTimeoutException ex)
{
  serviceProxyGlobal = new ServiceProxy();
  //retry maybe?
}
catch(Exception ex)
{
  logException(ex);
}
于 2012-07-23T17:58:46.340 に答える
0

単純な getter を使用してその共有 Web サービス参照にアクセスすることを検討してください。基本的には、Web サービスへの参照を返す直前に「ping」を試みます (その「ping」メソッドは、のように非常に単純なはずBoolean Ping() { return true; }です)。可能性のあるすべてのシナリオに対応する必要があります)、単にそれを処理し、それを抑制し (それが識別でき、予想される例外である場合)、新しい共有接続を作成します。

または、バックグラウンド スレッドで [Web サービスのタイムアウト (分単位)] / 2 分ごとに Web サービスに ping を実行する方法を設計することもできます。

于 2012-07-23T16:19:52.783 に答える