4

channelfactoryを使用してIIS7(TCP)のWCFサービスと通信するWCFクライアントを取得したとします。通信が切断された場合(またはサービスがリサイクルされた場合)、クライアントからの次の呼び出しは例外になります。

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

問題は、クライアント側のすべてのServiceAgentMethodに処理コードを追加せずにこれを行う簡単な方法があるかどうかです。これは、たとえばMessageInspectorで解決できますか?

私の場合、ChannelFactoryから作成された単一のIServceInterfaceを使用してサービスメソッドを実行するいくつかのAgentクラスをクライアントに取得しました。このようなもの :

MyServiceAgent.GetService().GetMyObjects

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

4

2 に答える 2

3

メッセージインスペクターを使用して試してはいけません; チャネルに障害が発生すると、ハードに障害が発生します(これまで見てきたように、例外が発生します)。これは、チャネルが有効でないと見なされ、呼び出しを行うべきではないことを示すために使用されます。

トランスポート層でこれを行うことができると思うかもしれませんが、決定するために、その上の層を調整する必要があります(実際にはアクセスできないはずの、ネットワークを介して入ってくるものを変換するため)。障害があるかどうか。

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

実行する再試行回数に制限を設けるように注意してください。そうしないと、毒薬になってしまいます(コードは無限に再試行されます)。ある時点で、例外をスローする必要があります。

于 2012-04-04T14:43:20.157 に答える
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

于 2017-02-11T14:17:44.057 に答える