我有一个WCF服务,它通过实现IErrorHandler接口来实现自定义错误处理。
现在,如果客户端发送带有无效XML结构的请求,则序列化程序将抛出InvalidOperationException,并最终进入自定义错误处理程序。 但是,InvalidOperationException对我来说似乎是一个非常普遍的例外,我担心服务器在处理请求时可能抛出这样的异常(应该只在真正特殊的情况下发生,但是一些奇怪的状态可能会产生这样的异常)。 / p>
这是两个不同的错误,应该导致两个不同的StatusCode设置为响应。如何可靠地识别异常的来源,以便我可以在自定义错误处理程序中设置正确的StatusCode? p>
答案 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
}
...
}