2011-11-09 59 views
3

我們有一個ASMX web服務,我們使用ajax(jQuery)從我們的ASP.NET應用程序中調用該服務。最佳實踐 - 拋出Web服務的異常

從我們的方法一個典型的例子是這樣的:

[WebMethod] 
public void DoSomething(BusinessObject myParameter) 
{ 

    try 
    { 
     BL.DoSomethingWithParam(myParameter); 
    } 
    catch(Exception ex) 
    { 
     //logic to log the actual exception goes here 
     //and then we throw a more user-friendly error as so: 
     throw new Exception("Unable to perform action such an such"); 
    } 
} 

在客戶端,我們將有這樣的事情:

$.ajax({ 
    type: "POST", 
    url: "WebService.asmx/DoSomething", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(result) { 
     //do something with result.d 
    }, 
    error: function(xhr, ajaxOptions, thrownError){ 
     alert($.parseJSON(xhr.Response.Text).Message); 
    } 
}); 

有幾個問題與上面的方法,我想修復:

  1. 當我們在我們的盒子上本地測試我們的應用程序時,Internet Explorer顯示實際的錯誤消息,我們扔在我們的Web方法拋出新的異常行(在提供示例代碼的情況下:「無法執行這樣和那樣的動作」)但是當我們部署到舞臺環境和遠程測試;它不再顯示我們拋出的錯誤,而是這個:"There has been an error processing your request."
  2. 在Firefox上(我們沒有測試更多的瀏覽器),它根本沒有顯示任何東西,但是Firebug顯示了一個HTTP 500錯誤被拋出。

總之,我們不妥善處理這一點,所以我的問題是:

  1. 什麼是這些錯誤傳達給客戶端,並具有一致的行爲在所有的瀏覽器,無論是,測試時的最佳方式本地和遠程?
  2. 爲什麼IE瀏覽器不像Firefox那樣打破?當然,通過不顯示真正的錯誤信息並將其替換爲通用的There has been an error processing your request,但是爲什麼Firefox不這樣做呢?
  3. 考慮到這個Web服務也將被公司內部的其他Java Web應用程序佔用,維護與這些應用程序的互操作性的最佳方式是什麼?我們仍然可以如何將這些異常拋出到我們的Web方法上,並讓Java應用程序能夠捕獲並正確處理它們?我們現在實施的 - 因爲

一個選擇,我們仍然在發展相位時發生錯誤,但是這確實是一個醜陋的黑客攻擊/不雅的方式這樣做只是爲了回報從我們的網站方法的字符串。

注意:不要問我「處理您的請求時出錯了」消息來自哪裏。我沒有最微不足道的想法。我們的代碼中沒有任何內容會返回該消息。

回答

6

我不知道一個「正確」的方式已經出現,因爲Web服務如何被使用的變化如此之快,最終,任何客戶端被構建爲使用該服務都能夠處理任何你選擇的方法。我毫不懷疑,最終會有人設計出來,但現在取決於你。

這麼說盡量避免一些我以前見過的更常見的陷阱。

  1. 缺乏一致性:如果您的Web服務有多種方法,想出一個辦法,使他們都以同樣的方式傳達錯誤,使您更容易的方法來消耗。我個人更喜歡遵循協議棧的腳步,並使用某種一致的頭文件。使用通用標題構建結果消息,以便在整個客戶端代碼中使用相同的邏輯來確定方法調用是否成功。
  2. 不支持多個錯誤消息:有時會發生多個故障。將客戶端視爲次要錯誤會令人討厭,並會減慢調試嘗試的速度。
  3. 缺少錯誤消息的識別:如果錯誤是特定字段無效的結果,允許客戶端根據您提供的信息以編程方式識別哪個字段是罪魁禍首。

的方法,我通常開始這些天看起來是這樣的:

{ 
    Success: bool, 
    Errors[]: { 
     Id: string, 
     Source: string, 
     Message: string 
    }, 
    Message: { *Method specific structure* } 
} 
+0

感謝您的提示。的確非常有用! – Icarus