2012-08-16 71 views
1

我想为全球提供误差在我的WCF应用程序处理,我知道我可以实现我的IErrorHandler,例如:全局的错误处理WCF - 但返回自定义消息

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 

不过,我” d真正想做的是“处理”异常,不仅仅是通过记录或抛出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”?

我的直觉是我需要使用属性,然后反射才能访问我的Service内部成员?但是如何将其分配回我的响应消息对象?

谢谢!

回答

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))); 

这使我们能够向客户提供定制DTO这是序列化到JSON。 (请注意,我们正在从我们的服务中返回一个Stream对象,以便能够返回像Json这样的自定义格式。)