我正在调用JQuery的Page方法,如下所述:http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/
这一切都很好。在测试期间,当我从Web方法的响应太大时,我遇到了一个错误: 使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性上设置的值。
我能够对maxJsonLength属性进行一些研究并将其设置得更高,但是我想在Ajax调用期间将它发送到客户端之前尝试捕获此异常服务器端。我该怎么做呢?
我在我的方法中设置了一个try / catch块无济于事,它发生在我的方法之外(在JSON序列化期间)。
StackTrace看起来像这样:
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调用做出有效的响应。
答案 0 :(得分:3)
这可能是一项很大的努力,但如果你正在设计一个设计良好的解决方案,我认为最好的办法是创建一个扩展服务处理程序的类,它实现了你自己的自定义序列化程序,在哪里检查maxJsonLength。然后,您可以设置web.config以使所有(或某些)asmx请求由您自己的处理程序处理。 Spring framework似乎促进了这一点,尽管我没有仔细研究这个解决方案。
请注意,在不破坏语法的情况下手动截断JSON字符串本身可能非常有用。
另一种解决方案,可能更容易实现,并且仍然可以说是非常简洁,可以用你自己的函数覆盖(或包装)jQuery的$.ajax
函数,在客户端上对JSON进行字符串化(无论如何,这是完成的,首先创建请求,因此它不应该是很多开销),并在那里检查长度。使用这种方法的好处是你不必乱用扩展服务处理程序,而且,截断对象的部分会更容易,因为你的javascript对象是可读的;你可以迭代它,字符串化它的子集,检查它们的长度,或者使用你喜欢的wahtever机制来实现智能截断(显然无论意味着截断你想要使用的JSON,你必须知道您的数据,以便能够在不破坏请求中的关键功能的情况下决定可以安全删除的内容。)
如果无法进行截断,您可以选择显示错误消息,甚至无需点击服务器。
由于javascript非常灵活,您可以指定$.ajaxCore = $.ajax
,然后使用您自己的函数覆盖$.ajax
,调用$.ajaxCore
。
答案 1 :(得分:2)
也许How to: Handle Page-Level Errors会有所帮助。
答案 2 :(得分:2)
您还可以尝试在应用中添加global exception handler。
答案 3 :(得分:1)
在从方法返回之前自己计算对象大小。你不需要做精确的计算,只需估计就可以了。最有可能的是获得可能很大的文本字段的大小(例如某些内容或注释的描述)。
如果结果大小超过某个限制,则截断数据。将MaxJsonLength设置为限制值的两倍。
答案 4 :(得分:0)
如果您无法访问实际抛出异常来修复它的序列化程序的底层代码,那么custom error handlers可能是一个选项吗?