9

フォールトを返さなければならない WCF サービスがあります。何らかの理由で、サービスへの呼び出しが次のエラーでタイムアウトし始めます。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。」

問題を調査した結果、あるパターンが明らかになりました。サービスが 10 回障害を返すと、タイムアウトが発生します。そこで、次のように実装されたテストサービスを作成しました。

public string GetData(int value)
{
    throw new FaultException("A testerror occured");
}

そしてテストクライアント:

   protected void RunTestGetData()
    {
        using (TestServiceReference.Service1Client client
            = new WSPerformanceTester.TestServiceReference.Service1Client())
        {
            try
            {
                client.GetData(1);
                client.Close();
                outputWriter.WriteLine(string.Format("Call run in thread {0}: GetData()", Thread.CurrentThread.ManagedThreadId));
                outputWriter.Flush();
            }
            catch (Exception e)
            {
                client.Abort();
                client.Close();
                outputWriter.WriteLine(string.Format("Error occured in thread {0}: GetData(): {1}", Thread.CurrentThread.ManagedThreadId, e.Message));
                outputWriter.Flush();
            }
        }
    }

これは、サービスが FaultException を返す場合にのみ発生します。通常の例外をスローすると、サービスは 10 回目の呼び出し後も実行を継続できます。明らかに、例外を適切にラップしたいので、通常の例外をスローするだけでは現実的な選択肢ではありません。

これらのタイムアウト例外が発生するのはなぜですか? 助けてくれてありがとう..

4

6 に答える 6

3

コメントするのに十分なポイントがないので、新しい応答...

自己ホスト型サービスでは、トランスポートに関係なく、最大 10 の同時接続のみが許可されます。IIS/WAS 内で WCF サービスを実行している場合は、これについて心配する必要はありません (最大同時接続数が 10 である XP/Vista を使用している場合を除く)。

このシナリオでのフォルト例外と通常の例外の違いが、表示されている結果の原因となっている可能性があります。

通常の未処理の例外は、チャネルでエラーになることに注意してください。そうすることで、これにより利用可能な接続が開かれると思います。フォルトを返すと、自動的にチャネルにフォルトが発生します。これにより、接続で何かを実行し、最後にフォルトを処理できるようになるためです。

障害を返した場合でも、接続を Abort() する必要があります。また、その下には管理されていないリソースがあるため、必ずクライアント/プロキシの呼び出し元に IDisposable を実装してください。

于 2009-06-12T18:58:27.813 に答える
2

これは、WCF サービスの既定の動作が 10 の同時セッションであるためと考えられます。FaultExceptions が発生した後、接続を開いたままにしていますか? BehaviorConfiguration (ServiceThrottling > MaxConcurrentSessions) でこの値を変更してみて、何かが変わるかどうかを確認してください。Microsof Service Configuration Editor を使用して、デフォルトで設定されているその他の値を確認することをお勧めします。( MSDN )

お役に立てれば...

于 2009-06-12T12:43:35.390 に答える
1

どうやら、クライアントコードは次のようになります。

protected void RunTestGetData()
{
    TestServiceReference.Service1Client client
        = new WSPerformanceTester.TestServiceReference.Service1Client()
    try
    {
        client.GetData(1);
    }
    catch (FaultException e)
    {
        //Handle fault
    }
    try
    {
        if (client.State != System.ServiceModel.CommunicationState.Faulted)
        {
            client.Close();
        }
    }
    catch(Exception e)
    {
        outputWriter.WriteLine("Error occured in Client.Close()");
        outputWriter.Flush();
        client.Abort();
    }
}

client.Abort()の呼び出しは、常に最後の手段である必要があります。

于 2009-06-18T09:15:14.213 に答える
1

ここで間違っているかもしれませんが、WCF サービスのホスティングと関係があると思います。

リクエストにタイムリーに対応できない可能性があるためです。

たとえば、Windows XP 上の IIS は、5 つの同時要求に応答できます (現時点ではよくわかりません)。さらに要求が行われると、キューに入れられます。

そして、テストは実際には何もせずに例外をスローするため、リクエストを失い、リクエストを処理しない可能性があると思います。

于 2009-06-12T12:19:48.817 に答える
0

私の WCF Service Model Client API を試して、同じ結果が発生するかどうかを確認してください。クライアントコードに何か問題があると思います...

コード

PPT

また、クライアントとサーバーの両方で詳細な WCF ログを有効にします...

于 2009-06-12T18:18:21.170 に答える