2012-04-04 27 views
4

channelfactoryを使用してIIS7(TCP)のWCFサービスと通信するWCFクライアントがあるとします。通信が切断された場合(またはサービスが再利用された場合)、クライアントからの次の呼び出しで例外が発生します。通信例外は自動的に再接続しますか?

この時点で、私は例外を隠し、代わりに再接続/再ログインを試みる必要があります。

クライアント側のすべてのServiceAgentMethodに処理コードを追加しないと、これを行う簡単な方法がある場合、質問はですか?例えば、MessageInspectorで解決することは可能でしょうか?

私のケースでは、ChannelFactoryから作成された単数のIServceInterfaceでサービスメソッドを実行するクライアントにいくつかのAgentクラスがあります。このようなもの:

MyServiceAgent.GetService().GetMyObjects 

GetService()は、ChannelFactoryによるログイン時に作成されたIServiceInterfaceを返します。

答えて

3

私はmessage inspectorを使って試してみません。チャンネルに障害が発生すると、というハードな番号(これまで見たように、例外が発生します)。これは、そのチャネルがもはや有効であるとみなされず、そのチャネルを呼び出すべきでないことを示すために使用されます。

トランスポート層でこれを行うことができますが、その上のレイヤーを調整する必要があります(実際にはアクセスできないワイヤーを翻訳するために)あなたに欠陥があるかどうかを判断するために。

最終的には、プロキシを呼び出すレベルで再試行ロジックを発行する必要があります。プロキシへの呼び出しの前/後にインターセプトするクライアント(インターフェイス)の抽象化があります。例外がある場合は、コールを再試行して、必要に応じて新しいプロキシ/チャネルを作成することができます。

実行するリトライ回数には制限を設けてください。あなたがしなければ、毒薬で終わるでしょう(あなたのコードは無限に再試行されます)。ある時点で、が例外をスローします。

+0

イムわかりませんクライアントのインターフェイスですか?思考は、ある種のデリゲートメソッドを使用することです。メソッドがデリゲートを呼び出してオブジェクトを返すとします。このメソッドはデリゲートを(サービスに対して)実行し、必要に応じて再接続を処理しようとします。成功した呼び出しが完了した時点で、オブジェクトを返し、エージェントメソッドにそれを正しい型にキャストさせます。それは働くだろうか? – Banshee

0

WCFコールを行うために使用できる汎用コンシューマを記述できます。提供されている例では、再試行回数を指定することができ、クライアントの破棄と再作成をより適切に処理します。

この

は、まだクライアント側になりますが、それは一般的なものでありかつ複雑に隠されているので、私はそれはエレガントなソリューションになり考える:あなたが何を意味するか

var consumer = new ServiceClientWrapper<AuthorServiceClient, AuthorService>(); 
author = consumer.Excecute(service => service.AddAuthor(request)); 

https://github.com/mariusvrstr/WcfClientStressTest/blob/master/Spike.Common/ServiceClientWrapper.cs

関連する問題