時々、さまざまな例外をスローし、さらにいくつかのエラーをstring
として返す、厄介なWCFサーバーを使用しています。私はサーバーコードにアクセスできません。WCFクライアント側のエラー処理
私は擬似、インナーWCFクライアント要求の呼び出しメソッドをオーバーライドして、サーバによって返されたすべての内部例外とハードコーディングされたエラーを処理し、エラーが発生した場合Fault
イベントを発生させたい:だから
class MyClient : MyServiceSoapClient
{
protected override OnInvoke()
{
object result;
try
{
result = base.OnInvoke();
if(result == "Error")
{
//raise fault event
}
catch
{
//raise fault event
}
}
}
私がmyClient.GetHelloWorld()
と呼ぶとき、それは私のオーバーライドされた方法を通ります。
これはどのように達成できますか?
私は生成されたクライアントを使用する必要はありませんが、すべてのコントラクトを再実装する必要はなく、生成されたClientBase
サブクラスまたは少なくともそのチャネルを使用したいと考えています。
私が必要とするのは、内部要求呼び出しメソッドの制御です。
更新
私は、このanswerを読んで、それは部分的に私が探しているものだように見えますが、唯一の消費者(クライアント)のコードへIErrorHandler
を添付する方法がある場合、私は思ったんだけど何とかそれをClientBase<TChannel>
インスタンスに追加したいと思います。
更新
This記事はまた、非常に有望に見えるが、それは動作しません。適用された属性は有効には見えません。 IServiceBehavior
をクライアント側に追加する方法が見つかりません。
アップデートは私がIErrorHandler
IEndpointBehavior.ApplyClientBehavior
を経由して通話付けてみました:
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.CallbackDispatchRuntime.ChannelDispatcher.ErrorHandlers
.Add(new ErrorHandler());
}
を(clientRuntime
がパラメータである)が、例外は、まだ直接MyErrorHandler
をスキップスローされます。
ApplyDispatchBehavior
はまったく呼び出されません。
私は二つの側面を達成する必要が
結論:
- ラップ
BaseClient<TChannel>
の存続期間中に発生し、それらを処理するか、それらをスローするかどうかを決定する可能性があるすべての例外を。これは、(私が消費してるサービスが数十を公開する)すべての操作の - 解析すべてのサーバーの応答を世話をし、そのうちのいくつかのために例外をスローので、彼らは声明1.
あなたがサービスのapp.configファイルまたはweb.configファイルへのアクセス権を持っていますか? –
@DavidP私はサーバーコードにアクセスできません。また、アプリの設定やアプリの設定を使用するのではなく、設定をプログラムで設定することをおすすめします。 – Shimmy
オクラホマ - あなたが今やっていることを理解していると思います。サービスが例外を返すか、文字列メッセージで正常に返されますか? @DavidPともに –