WCFを使用してサーバーと通信するクライアントマシン上でWindowsサービスを実行しています。WCFクライアントWindowsサービス - 接続エラーの処理方法?
- クライアントは3分ごとに、DuplexChannelFactory(CreateChannel)を使用してサーバーに接続します。
- この接続が開いている間、サーバーはクライアントにメッセージを送信します。
サーバーはいつでもクライアントと通信する必要があるため、接続は常に開いたままでなければなりません。これが数分おきに接続をリフレッシュする理由です。
ほとんどの場合、このシステムは正常に動作します。ただし、クライアントのインターネット接続が不安定な場合、チャネルは中止されます。この場合、次のようになります。
- クライアントが接続を開きます。この接続は、閉じてから再び開くまで3分間開いたままです。
- 最初の接続中、コンピュータは数秒間インターネット接続を失います。
- クライアントで実行されているWindowsサービスは、System.Net.Sockets.SocketExceptionおよびSystem.ServiceModel.CommunicationExceptionをスローします。コードは現在、これらの例外をキャッチしません。
- コンピュータはインターネット接続を回復します。
- サーバーはクライアントと通信しようとします(最初の3分間は依然として)。
- 最初の接続がまだ開いているため、サーバーは通信できず、次のエラーが発生します。通信オブジェクトSystem.ServiceModel.Channels.ServiceChannelは、中止されているため通信に使用できません。
私は現在の接続を閉じて再オープンできるように、手順3で発生したエラーをどのように捕捉できるかを把握しようとしています。私は現在Faultedイベントを処理する関数を持っていますが、接続が失われたときにこのイベントはヒットしません。私はグローバルなエラー処理を調べてみましたが、チュートリアルのほとんどはクライアントではなくサーバ側のようです。また、接続は無期限に開いているので、実際に実行されているコードがないのでtry/catchブロックを置くことができません。
あなたのデザインを再訪したいと思うかもしれません。私の経験では、Webサービスはon/connectedの常時接続を意図したものではありません。あなたはクライアントでtry-catchブロックを持っていますか?おそらく、あなたはそこでエラーをキャッチし、チャンネルを中止して新しいものを入手することができますか? – Tim
アプリケーションサービスの通信が多少非同期である場合、クライアントアプリケーションにもWCFサービスが組み込まれている必要があります。リモートサービスに要求を送信し、しばらく処理し、完了すると、クライアントサービスに接続して応答を送信します。クライアントサービスが利用できない場合、クライアントサービスはキューに入れられ、後で再試行されます。とにかくこれは私がやる方法です。 –
イントラネットのような安全なネットワークにいる場合は、クライアントにサービスを追加するか、ソケットプログラミングを使用することができます。 WCFがあなたのために提供するものでもっと多くを行うことができるので、両端でWCFサービスを使用するほうが便利ですが、ソケットプログラミングは双方向接続の利点を持っています。 – Ashkan