1

サーバーへの HTTP 呼び出しを再試行するだけで解決するために、この一般的なエラーをスローした WCF クライアントがあります。この例外は 1 分以内に生成されませんでした。3秒で生成されました。

xxxxxx に送信された要求操作は、構成されたタイムアウト (00:01:00) 内に応答を受信しませんでした。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。これは、サービスがまだ操作を処理中であるか、サービスが応答メッセージを送信できなかったことが原因である可能性があります。(チャネル/プロキシを IContextChannel にキャストし、OperationTimeout プロパティを設定することによって) 操作のタイムアウトを増やすことを検討し、サービスがクライアントに接続できることを確認してください。

専門家はこれらの一般的な WCF エラーをどのように処理していますか? 他にどのような偽のエラーを処理する必要がありますか。

たとえば、WCF 呼び出しのタイミングを検討していて、上記の (偽の) エラーが 55 秒以内にスローされた場合は、(while() ループを使用して) 操作全体を再試行します。チャンネル全体をリセットする必要があると思いますが、どうすればよいか教えていただければ幸いです。

他に何

4

1 に答える 1

1

例外と潜在的なリタイアを処理するカスタムの "using" ステートメントからすべての WCF 呼び出しを行います。私のコードでは、必要に応じてポリシー オブジェクトをステートメントに渡すことができるため、エラー時に再試行したくない場合などに、動作を簡単に変更できます。

コードの要点は次のとおりです。

[MethodImpl(MethodImplOptions.NoInlining)]
public static void ProxyUsing<T>(ClientBase<T> proxy, Action action)
    where T : class
{
    try
    {
        proxy.Open();
        using(OperationContextScope context = new OperationContextScope(proxy.InnerChannel))
        {
          //Add some headers here, or whatever you want
            action();
        }
    }
    catch(FaultException fe)
    {
      //Handle stuff here
    }
    finally
    {
        try
        {
            if(proxy != null
                && proxy.State != CommunicationState.Faulted)
            {
                proxy.Close();
            }
            else
            {
                proxy.Abort();
            }
        }
        catch
        {
            if(proxy != null)
            {
                proxy.Abort();
            }
        }
    }
}

その後、次のように呼び出しを使用できます。

ProxyUsing<IMyService>(myService = GetServiceInstance(), () =>
{
    myService.SomeMethod(...);
});

NoInlining 呼び出しは、おそらく重要ではありません。例外の後にコール スタックをログに記録するカスタム ログ コードがいくつかあるため、それが必要です。その場合、そのメソッド階層を保持することが重要です。

于 2011-01-21T03:47:57.357 に答える