2011-08-09 121 views
1

返回錯誤條件到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是不是與我們的無線點沿着今天獲得,無法測試實際設備。

回答

0

我可以回答第一個問題。除非JSON的默認WCF處理不適用於您,否則我不會承擔定製開銷。如果我偏離服務器端的標準WCF處理,特別是對於REST實現(這對您的移動場景非常有用),我會研究WCF Web API,該API現在已移至Microsoft的AppFabric團隊。您可以在CodePlex上找到最新版本(仍處於測試階段)。只有在需要時纔會從內置的東西中散出,因爲存在很多編碼開銷。

不能確定問題#2,因爲我沒有在等式的移動端工作過很多(我在服務器/ API端工作)。我也不確定WCF Web API是如何處理這個問題的,但至少會看到這個方向,特別是當你使用RESTful服務時。我推薦的理由是所有的跡象都表明,Web API是微軟走向未來REST的方向。

+0

謝謝Gregory,我會研究一下。我試圖不要太深入這個原型,直到我找到正確的實現。由於Sencha Touch是MVC-ish,並且似乎希望在它背後有一個REST服務,這聽起來像是一個很好的解決方案。 – BLSully

+0

我最終將我的Web服務(這是一個ASMX)轉換爲Web服務,並且我的客戶端依賴的錯誤問題消失了。現在所有設備都得到相同的響應。仍然好奇於'爲什麼',但不管如何,切換到WCF似乎是解決方案。感謝您的意見 – BLSully