2009-08-06 11 views
14

私は、WCF Webサービス経由でメッセージを送信するために10秒ごとに試行するクライアントアプリケーションを用意しています。このクライアントアプリケーションは船上にあるコンピュータにインストールされますが、インターネットに接続できないことがわかっています。私は、サービスを介してデータを送信しようとすると、それがサービスを介して送信できるようになるまで、メッセージをキューにすることができない場合は、アプリにしたいと思います。WCFのCommunicationObjectFaultedExceptionからの回復

この設定をテストするために、私はクライアントアプリケーションとWebサービス(ローカルマシン上の両方)を起動し、すべて正常に動作します。私は、Webサービスを強制終了して再起動することで、悪いインターネット接続をシミュレートしようとします。私がサービスを終了するとすぐに、私はCommunicationObjectFaultedExceptionsを取得し始めます - これは期待されています。しかし、サービスを再開しても、私はその例外を引き続き取得します。

私は、Webサービスのパラダイムについて理解していないことがありますが、それが何であるか分かりません。この設定が可能かどうかのアドバイスを誰でも提供できますか?その場合は、この問題の解決方法(つまり、通信チャンネルをウェブサービスと再確立する方法)を教えてください。

ありがとうございます!彼らは障害が発生した後

Klay

答えて

33

クライアントサービスプロキシを再利用することはできません。あなたは古いものを処分し、新しいものを作り直さなければなりません。

また、クライアントサービスプロキシを適切に閉じる必要があります。 WCFサービスプロキシがクローズ時に例外をスローする可能性があります。この場合、接続が閉じられないため、中止する必要があります。 "try {Close}/catch {Abort}"パターンを使用してください。また、disposeメソッドはcloseを呼び出す(したがってdisposeから例外をスローすることができる)ので、通常の使い捨てクラスのように使用することはできません。例えば

:私はできれば

try 
{ 
    if (yourServiceProxy != null) 
    { 
     if (yourServiceProxy.State != CommunicationState.Faulted) 
     { 
      yourServiceProxy.Close(); 
     } 
     else 
     { 
      yourServiceProxy.Abort(); 
     } 
    } 
} 
catch (CommunicationException) 
{ 
    // Communication exceptions are normal when 
    // closing the connection. 
    yourServiceProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    // Timeout exceptions are normal when closing 
    // the connection. 
    yourServiceProxy.Abort(); 
} 
catch (Exception) 
{ 
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards. 
    yourServiceProxy.Abort(); 
    throw; 
} 
finally 
{ 
    // This is just to stop you from trying to 
    // close it again (with the null check at the start). 
    // This may not be necessary depending on 
    // your architecture. 
    yourServiceProxy = null; 
} 

このhere

+0

10についてのブログの記事があります - うわー、この動作は完全にレーダーの下、何が起こっていたか働いてもみませんでしたさもし私がこの答えに遭遇しなかったならば。 –

+0

ブラボー!私はこれを拡張メソッドとして実装しました。他の人が使用できるようにプロキシクラスをTryDisposeします。 –

+0

@ Moby's Stuntダブル - あなたのコードを共有できますか? – RichardHowells

関連する問題