私はIErrorHandlerインターフェイスを使用してWCFでグローバルエラー処理を実装しようとしていますが、(未処理の例外の場合)単純な文字列 (これは私のサービスの戻り値の型です)それを達成する? IErrorHandler内のProvideFaultメソッドはMessage型の 'fault'引数を設定し、メッセージ型ToString()は応答のようなXMLを生成します。 (私のクライアントは単純な文字列を特定の形式で取得したいので)。WCFグローバルエラー処理
おかげ
私はIErrorHandlerインターフェイスを使用してWCFでグローバルエラー処理を実装しようとしていますが、(未処理の例外の場合)単純な文字列 (これは私のサービスの戻り値の型です)それを達成する? IErrorHandler内のProvideFaultメソッドはMessage型の 'fault'引数を設定し、メッセージ型ToString()は応答のようなXMLを生成します。 (私のクライアントは単純な文字列を特定の形式で取得したいので)。WCFグローバルエラー処理
おかげ
documentationによると、
IErrorHandlerはあなたが明示的にそれがサービスの実際の戻り値を変更するためではありません
を生成し、SOAP障害を制御することができます。
私が正しく理解していれば、あなたのサービスはすでに文字列を返しています。エラーが発生した場合は、サービスが特定の文字列を返すようにします。最も単純な形式で
、これは次のようになります。あなたはすべての方法では、同じコードを書き込まないようにしたい場合は
public string YourServiceMethod(int someInput)
{
try
{
// Do whatever the method does
}
catch(Exception ex)
{
// Log the exception, probably?
return "This is the specific error message I want to return."
}
}
、それを達成するための1つの方法は、このようなCastle Windsor's dependency injection containerと同様に、インターセプタを使用しています。
これは、ウィンザー(または類似のDIフレームワーク)を使用するようにWCFサービス全体を変更することを意味しますが、他の多くの理由から価値があります。私は、私が書いたすべてのWCFサービスのためにそれを使用します。ウィンザーをWCFサービスに5分間で追加する方法については、tutorialです。
次に、インターセプターと呼ばれるクラスを作成します。それはこのようになります:
public class ErrorMessageInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
}
catch (Exception ex)
{
// log your exception
invocation.ReturnValue = "Your specific error message.";
}
}
}
はその後、あなたがコンテナを使用してサービスを登録するときにこれを行うだろう:
container.Register(
Component.For<IInterceptor>().ImplementedBy<ServerLogInterceptor>()
.Named("ErrorMessageInterceptor"));
container.Register(Component.For<IYourService,YourService>()
.Interceptors("ErrorMessageInterceptor"));
IYourService
は、あなたのサービス・インターフェースであるとYourService
は、実際のサービスクラスです。
これはYourService
のインスタンスが起動するたびに、ErrorMessageInterceptor
のインスタンスが作成されることを意味します。サービスのメソッドへのすべての呼び出しは、インターセプタのIntercept
メソッドによって「インターセプト」されます。元のメソッドに直接追加することなくメソッド呼び出しの周りに基本的にtry/catch
を入れています。
必要があれば、より具体的にすることができます。たとえば、インターセプタはinvocation.Method.ReturnType
をチェックして、メソッドが文字列を返すかどうかを確認し、エラーメッセージのみを追加することができます。
インターセプタを使用するとすばらしいことができます。このようなシナリオで、小さなものを試してみると、それらを使って作業する素晴らしい機会になります。あなたがWCFでDIを使用していない場合は、それが変わったように見えますが、一度試してみると非常に便利なパターンです。
こんにちは、 そのアイデアのためのタンク私は本当にその方向に思っていませんでしたが、それは意味があります と私はすでに城を使用するように私のコードを変更するので、私のニーズのための良いオプションのように見えます。 – eitanby
私が正しく理解していれば、あなたのサービスメソッドはすでに文字列を返しています。例外が発生した場合、サービスから返す特定の文字列がありますか? –
@ScottHannenはい、正確です。私はグローバルエラーハンドラからこれをやりたい – eitanby
グローバルエラーハンドラではなく、すべてのサービスメソッドに同じコードを書く必要はありません。 –