0

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

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

这是两个不同的错误,应该导致为响应设置两个不同的 StatusCode。如何可靠地识别异常源,以便在自定义错误处理程序中设置正确的 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 回答