2009-06-12 2 views
8

私は、Faultを返さなければならないWCFサービスを持っています。何らかの理由で、サービスへの呼び出しが次のエラーでタイムアウトになります。 "00:00:59.8906201の後に応答を待っている間にリクエストチャネルがタイムアウトしました。 BindingのSendTimeout値。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。WCFサービスがFaultExceptionを返すのはなぜですか?10回の呼び出し後にタイムアウトしますか?

問題を調べた後、パターンが現れました。サービスが障害を10回返すと、タイムアウトが開始されます。

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

そしてtestclient:だから私はによって実装testserviceを作成したサービスは、FaultExceptionを返すされている場合にのみ、起こる

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(); 
      } 
     } 
    } 

。通常の例外をスローすると、10回目の呼び出し後にサービスを継続できます。明らかに、私は例外をきれいに包み込みたいので、通常の例外を投げることは本当の選択肢ではありません。

なぜこれらのタイムアウト例外が発生しますか?事前に助けてくれてありがとう。

答えて

1

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

client.Abortを(呼び出し
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(); 
    } 
} 

)は常に最後の手段でなければなりません。

+2

[引用が必要] – piers7

1

私はここで間違っているかもしれないが、私はそれがWCFサービスのホスティングと関係があると思う。

リクエストにタイムリーに対応できない場合があります。

たとえば、Windows XPでは、IISは5に返信することができます(そして、今私はそれについて今確信していません)。より多くのリクエストが行われると、キューに移動します。

あなたのテストは実際に何もしませんが、例外をスローするので、要求が失われている可能性があり、処理していない可能性があります。

2

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

希望...

+0

しかし、client.Abort()またはclient.Close()はセッションを閉じてはいけませんか? FaultExceptionを使用すると、なぜこれが起こっているのですか? –

+0

私はJesperと同じ質問があります。誰でも? –

+1

説明については@ Jarrod268の回答を参照してください...ありがとう! – RoelF

0

は私のWCFサービスモデルのクライアントAPIを試してみて、同じ結果が発生したかどうかを確認します。 I「は、クライアントとサーバーの両方で冗長WCFログを有効また

The PPT

The Code

...

3

私はドン...何かがクライアントコードでは適切ではないと思いますよコメントするのに十分なポイントがあるので、新しいレスポンスが返されます。

セルフホストサービスでは、転送に関係なく、最大10の同時接続しか許可されません。 IIS/WASの内部でWCFサービスを実行している場合は、これについて心配する必要はありません(最大同時接続数が10であるXP/Vistaでない限り)。

このシナリオでのフォールト例外と通常の例外の違いにより、表示されている結果が説明されます。

通常の処理されない例外は、チャネルに不具合が発生することに注意してください。そうすることで、私はこれが利用可能な接続を開くと仮定します。あなたがフォールトを返すと、自動的にフォルトが発生します。なぜなら、接続で何かを行い、最終的にフォールトを処理することができるからです。

フォールトを返しても、依然として接続を中止する必要があります。また、管理されていないリソースがあるので、クライアント/プロキシの呼び出し元にIDisposableを実装するようにしてください。

2

私は同じ問題に直面していました。私は、Webサービスへの呼び出しを完了した後、私は、Webサービスクライアントを閉じていないことを明らかにした。私がそれをしたら、Webサービスへの10回のメソッド呼び出しの後でも失敗しなかった。以下の例を参照してください。

WebServiceClient svcClient = new WebServiceClient(); 

string returnValue = svcClient.GetDocumentName(fileId); 

svcClient.Close(); 

適切なパターン:

using(WebServiceClient svcClient = new WebServiceClient()) 
{ 
    return svcClient.GetDocumentName(fileId); 
} 

ClientBaseIDisposableを実装し、Disposeメソッド内Close()を呼び出します。

+3

WCFクライアントをusingステートメントでラップすることは避けてください。次の記事を参照してください。http://msdn.microsoft.com/en-us/library/aa355056.aspx –

+0

この問題もありましたが、問題をトレースするのは非常に困難でした。とにかく投稿してくれてありがとう – zulucoda

関連する問題