2009-11-02 62 views
3

我打電話從JQuery的頁面方法如下所述:http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/如何在來自JQuery的Ajax調用期間處理服務器端異常?

這一切工作正常。在測試過程中,當我的Web方法響應太大時,發現錯誤: 使用JSON JavaScriptSerializer進行序列化或反序列化時出錯。字符串的長度超過maxJsonLength屬性中設置的值。

我能夠對maxJsonLength屬性進行一些研究並將其設置得更高,但是我想在Ajax調用期間發送給客戶端之前嘗試捕獲此異常serverside。我該怎麼做呢?

我已經把我的方法都無濟於事內的try/catch塊,這是我的方法外發生的事情(JSON序列化過程中)。

堆棧跟蹤看起來是這樣的:

at System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat) 
at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams) 
at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)

更新
全球和頁面級漁獲量也不會爲我工作(但在這一點上可能會獲得賞金維持全球例外。對於一個頁面調用非常具體的東西似乎是一個糟糕的設計決定。)我想要捕捉異常的一點是,我可以對文本進行大寫操作,並仍然對JavaScript調用做出有效響應。

回答

3

這可能是一個很大的努力,但如果一個設計良好的解決方案是你以後,我想你最好的選擇可能是創建一個類,擴展服務處理器,實現自己的自定義序列化,在那裏你檢查maxJsonLength。然後,您可以設置您的web.config,讓所有(或某些)asmx請求由您自己的處理程序處理。 Spring framework似乎有助於這一點,但我沒有仔細研究這個解決方案。

要知道,雖然,手動截斷JSON字符串,不破壞語法,可能是本身相當的努力。

另一種解決方案,這將可能是更容易實現,而且還可以說是非常簡潔,將覆蓋(或包裹)jQuery的$.ajax功能用自己的功能,即stringifies客戶端上的JSON(這樣做無論如何,首先要創建請求,所以它不應該是一個很大的開銷),並在那裏檢查長度。這種方法的好處是你不必擔心擴展服務處理器的問題,而且,截斷對象的部分會更容易,因爲你的JavaScript對象正在讀取;你可以迭代它,對它的子集進行字符串化,檢查它們的長度,或者使用你喜歡的wahtever機制來實現智能截斷(顯然無論是什麼截斷你想使用的JSON的方法,你必須知道你的數據,能夠決定什麼可以安全地被刪除而不會破壞請求中的關鍵功能)。

如果截斷無法做到的,你必須顯示錯誤消息,甚至無需點擊服務器的選項。

由於javascript非常靈活,您可以指定(例如)$.ajaxCore = $.ajax,然後用您自己的函數覆蓋$.ajax,即調用$.ajaxCore

+0

問題是,在我的方法運行後,但在Ajax有機會做自己的截斷之前,太長的文本被確定爲在服務器上太長。能夠捕捉錯誤的想法是我可以手動查看我發送的對象並截斷錯誤的特定字段。 – 2009-12-10 15:50:39

+0

對於鏈接壽命非簡單的一行應答+1。 – 2009-12-10 15:51:16

+0

哦,對不起,我錯誤地把你作爲傳入請求的問題= /所以你的問題基本上是你返回一個對象,並且代碼失敗後,你已經交出服務器的返回對象序列化?那麼,在那種情況下,如何在try/catch-block內手動調用'System.Web.Script.Services.JavaScriptSerializer.Serialize'?我知道你當前的執行發生在你不能嘗試/捕獲它的地方,但是不僅僅是返回myObject,而是返回getValidatedObject(myObject),然後getValidatedObject序列化,捕獲異常和截斷,並且... – 2009-12-10 17:22:00

0

如果您不能訪問這實際上拋出該異常來修復它串行的底層代碼,也許custom error handlers是一種選擇?

1

在從方法返回之前自己計算對象大小。你不需要做精確的計算,只需估計就可以。最有可能的是獲得可能很大的文本字段的大小(例如描述某些內容或評論)。

如果結果大小大於某個限制,則截斷數據。將MaxJsonLength設置爲您的限制的兩倍。

相關問題