返回錯誤條件到JavaScript客戶端這是怎樣的一個2部分的問題:從.NET Web服務方法
1)什麼是更好的方法,讓.NET轉換原生對象到JSON,或使用包裝並自己編碼它們(例如公共字符串DataTableToJSON(DataTable))
2)如果第一個問題的答案是前一種方法,如何最好地將錯誤條件傳遞給客戶端(JavaScript AJAX請求,通常使用jQuery或這個具體的案例,Sencha Touch(Ext))?我目前的方法(在這個問題中進一步解釋)似乎工作得很好,但存在一個似乎依賴於客戶端的問題。
我從Web服務返回響應的'舊'方式是將所有方法聲明爲字符串。我已經這樣做了幾年,它運作良好,但感覺有點笨拙。例如:
public string Test(){
try{
Dataset ds = SomeMethodThatReturnsADataSet();
} catch (Exception ex){
return "ERROR";
//my JS checks for these messages to be sure everything went OK on the server
}
return DataTable_To_JSON(ds);
//at the client this looks something like {d:"[[\"Row1Data\"],[\"Row2Data\"]]"}
}
顯然,這在客戶端創建一個輕微的開銷,因爲我們必須擁有的JavaScript的一個額外的行如var data = JSON.parse(response.d);
所以最近我開始意識到,鑑於Web服務的ResponseFormat = ResponseFormat.Json
說法,.NET將處理JSON編碼的一些.NET對象(遺憾的是我無法讓DataTable類型工作,但這是另一個問題)。所以,現在我的web服務方法看起來更像是這樣的:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public List<MyObject> GetMyObjectList(string arg){
List<MyObject> li = MyObjectClass.GetList(arg);
if(li.Count > 500){
//Since we must return a .NET List<MyObject> I can't return strings on error conditions, so this isn't an option:
return "TOO_MANY_RESULTS";
//I saw an example somewhere to do this which works _almost_ great:
throw new Exception("TOO_MANY_RESULTS");
}
return li;
}
就像我在代碼中的註釋說,拋出一個異常,返回HTTP 500具有很好的格式化的JSON響應這是很容易的陷阱,並在「失敗」處理回調Ext.Ajax.request,像這樣:在iPad上測試應用程序時(使用Chrome和Safari)
{"Message":"TOO_MANY_RESULTS","StackTrace":" at ...","ExceptionType":"System.Exception"}
然而,出於某種原因,我得到一個「通用」異常消息迴應:
{"Message":"There was an error processing the request","StackTrace":"","ExceptionType":""}
我已經調試並追蹤了代碼,它確實在C#中觸發了相同的「拋出新的異常」行,它並未在代碼的其他部分失敗。出於某種原因,看起來客戶端的請求頭部以某種方式影響了.NET決定返回的內容。
有沒有人有什麼想法試圖讓.NET總是返回我傳入異常的消息?
編輯:還正確工作在Android(得到 「TOO_MANY_RESULTS」 在服務器響應)。我會盡快測試iPhone。
編輯2:在iPhone模擬器正確工作,物理iPhone是不是與我們的無線點沿着今天獲得,無法測試實際設備。
謝謝Gregory,我會研究一下。我試圖不要太深入這個原型,直到我找到正確的實現。由於Sencha Touch是MVC-ish,並且似乎希望在它背後有一個REST服務,這聽起來像是一個很好的解決方案。 – BLSully
我最終將我的Web服務(這是一個ASMX)轉換爲Web服務,並且我的客戶端依賴的錯誤問題消失了。現在所有設備都得到相同的響應。仍然好奇於'爲什麼',但不管如何,切換到WCF似乎是解決方案。感謝您的意見 – BLSully