2010-01-10 111 views
3

我從jquery ajax調用WCF服務。有時候服務會拋出一些自定義錯誤,當它發生時,我需要獲取錯誤信息。在我的Ajax調用的誤差函數我有以下代碼:從jquery調用wcf服務時獲取異常消息

  error: function(data) { 
       alert("responseText: " + data.responseText); 
      } 

而且responseText的時候拋出錯誤看起來像:

responseText: {"ExceptionDetail":{"HelpLink":null,"InnerException":null,"Message":"Denied",......}} 

我希望從中獲取「消息」「 ExceptionDetail「,但我不知道該怎麼做。

我的WCF服務是這樣的,爲了測試它,我只是拋出一個錯誤:

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json)] 
public string myFunction(string id) 
{ 
    throw new Exception("Denied"); 
} 

我怎樣才能得到錯誤的信息?

回答

5

默認情況下,WCF將而不是返回任何異常詳細信息 - 這是一個通過設計的通緝功能,以避免向可能的攻擊者泄漏太多信息。

如果要啓用詳細的異常信息,您可以通過啓用對服務器端的行爲,這樣做:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="debugBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <services> 
     <service name="YourService" 
       behaviorConfiguration="debugBehavior"> 
      ..... 
     </service> 
    </services> 

但即使是現在 - 你需要知道,WCF應是可互操作的,因此客戶端可能不在.NET上運行 - >因此,您不能只是簡單地拋出一個異常 - 這是一個.NET特定的構造。

您的最佳選擇是捕獲服務器上的所有異常(例如使用IErrorHandler接口),並將它們轉換爲SOAP錯誤 - 這是.NET異常的可互操作等價物。如果您知道另一端始終是.NET客戶端,則可以輕鬆地將.NET異常轉換爲其中T是.NET異常的FaultException<T>

當你這樣做,你可以通過捕獲FaultException<T>趕在客戶端上的例外,它的.Detail屬性應包含正常的.NET異常,因爲你知道它(幷包含.Message屬性與異常消息)。

+0

非常感謝! – Martin 2010-01-10 11:34:48

0

我們需要做的第一件事就是設置< serviceDebug includeExceptionDetailInFaults = 「TRUE」 web.config中如上面所提到/ >通過像marc_s:在jQuery的水平

<serviceBehaviors> 
<behavior name=""> 
    <serviceMetadata httpGetEnabled="true" /> 
    **<serviceDebug includeExceptionDetailInFaults="true" />** 
</behavior> 

除此之外在錯誤的一部分,你需要解析包含異常的錯誤響應,如:

.error(function (response, q, t) { 
     var r = jQuery.parseJSON(response.responseText); 
    }); 

然後使用r.Message,你可以實際顯示異常文本。

請看完整代碼:http://www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html