0

IErrorHandler インターフェイスを実装することでカスタム エラー処理を実装する WCF サービスがあります。

ここで、クライアントが無効な XML 構造を持つリクエストを送信すると、シリアライザーは InvalidOperationException をスローし、最終的にカスタム エラー ハンドラーになります。ただし、 InvalidOperationException は私にはかなり一般的な例外のように思え、サーバーがリクエストの処理中にそのような例外をスローするのではないかと心配しています (本当に例外的な場合にのみ発生するはずですが、奇妙な状態がそのような例外を生成する可能性があります)。

これらは 2 つの異なるエラーであり、2 つの異なる StatusCodes が応答に設定されます。カスタム エラー ハンドラで適切な StatusCode を設定できるように、例外のソースを確実に特定するにはどうすればよいですか?

4

2 に答える 2

0

System.Exception検証が失敗した場所から派生してスローすることにより、独自の例外クラスを作成する必要があります。実装では、例外が自分IErrorHandlerのものであるかどうかを確認し、必要なステータス コードを返す必要があります。たとえばMyException、派生した例外だった場合:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
   MyException me = error as MyException;
      if(me != null)
          // Set the status code.
}
于 2013-06-25T07:08:10.003 に答える
0

無効な XML に対してシリアライザーによってスローされる例外は、型の内部例外を持つ InvalidOperationException であると思いますSystem.Runtime.Serialization.SerializationException

これを検出すると、必要なエラー固有の処理を実行できます。例えば:

public bool HandleError(Exception error)
{
   string output = "Unknown error";

   if (error.InnerException is System.Runtime.Serialization.SerializationException)
   {
      output = "Malformed message";
   }

   TraceSource traceSource = new TraceSource("YourTraceSource");
   traceSource.TraceEvent(TraceEventType.Error, 0, output);

   return false;
}

または

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
    if (error.InnerException is System.Runtime.Serialization.SerializationException)
    {
       //set malformed message status code (400?)
    }
    else
    {
       //set other status code
    }

    ...
}
于 2013-06-25T08:25:22.367 に答える