在自定义WCF错误处理中将内部错误与客户端错误分开?

时间:2013-06-24 08:41:20

标签: wcf

我有一个WCF服务,它通过实现IErrorHandler接口来实现自定义错误处理。

现在,如果客户端发送带有无效XML结构的请求,则序列化程序将抛出InvalidOperationException,并最终进入自定义错误处理程序。 但是,InvalidOperationException对我来说似乎是一个非常普遍的例外,我担心服务器在处理请求时可能抛出这样的异常(应该只在真正特殊的情况下发生,但是一些奇怪的状态可能会产生这样的异常)。 / p>

这是两个不同的错误,应该导致两个不同的StatusCode设置为响应。如何可靠地识别异常的来源,以便我可以在自定义错误处理程序中设置正确的StatusCode?

2 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分: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
    }

    ...
}