我想在我的WCF应用程序中提供全局错误处理,我知道我可以实现我的IErrorHandler,例如:
http://www.remondo.net/wcf-global-exception-handling-attribute-and-ierrorhandler/
http://www.codeproject.com/Articles/26320/WCF-Error-Handling-and-Fault-Conversion
http://www.haveyougotwoods.ca/2009/06/24/creating-a-global-error-handler-in-wcf
但是,我真正想做的是“处理”异常,不仅仅是通过记录或抛出Fault异常,而是通过将自定义消息传回给调用者。我们已经使用自定义消息返回与业务相关的消息(如验证错误或警告)。
在非常粗略的伪代码中,我会在像这样的try-catch块中执行此操作
public MyResponseDto CallMyService(MyRequestDto request)
{
...
try
responseDto = blah blah blah
catch (Exception ex)
responseDto.ClientMessage.Description = ex.Messaeg
finally
return responseDto;
}
我的问题是 - 如何在我的全局处理程序中执行此操作?它将如何访问“ClientMessage”?
我的直觉是我需要使用属性然后反射来访问我的服务内部成员???但是如何将其分配回我的响应消息对象?
谢谢!
答案 0 :(得分:0)
迟到一年左右,但对于那些可能会发现你问题的人来说......
IErrorHandler界面中ProvideFault方法的签名如下所示:
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
最后一个参数是你要找的。 Message类有一个静态方法CreateMessage(),它有很多重载。我们这样使用它:
fault = Message.CreateMessage(version, "", new CustomErrorMessageDto("some error message"), new DataContractJsonSerializer(typeof(CustomErrorMessageDto)));
这允许我们为客户端提供一个序列化为Json的自定义DTO。 (请注意,我们从服务中返回一个Stream对象,以便能够返回像Json这样的自定义格式。)