2012-08-16 92 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這樣的自定義格式。)