2013-01-11 22 views
1

首先让我开始说我知道这个错误的含义。 我知道<jsonSerialization maxJsonLength="50000000"/> 而且我明白(在我看来,非常好)有限制的原因。检测字符串的长度超过服务器上maxJsonLength属性设置的值

因此,我使用.NET ScriptManager从JavaScript调用web服务为我创建所有客户端代码。

Web服务从SQL获取一堆数据,将其转换为对象数组,然后返回该数组。

.NET引擎将这个数组转换为一个JSON数组发送到客户端。

但是,有时候产生的JSON字符串太长,会引发异常。

我想检测这种错误,并适当地处理它的一些通用的方法(例如,通过发送一些数据与指标,另一个后续请求中提出,要得到休息)

我不想要什么要做的就是对json字符串的长度设置一个天空上限,因为这可能会导致在客户端获取所有数据之前花费很长时间。我相信这个设置的上限是2147483644,即2GB。 当客户端试图解析JavaScript引擎时,客户端很可能会感到无聊,并且在所有数据到达的时候都会随时崩溃。

所以我想我真正想知道的是一种方法来“知道”多久后得到的json字符串将返回它之前,以便它可以被截断适当,或某种方式来处理结果的错误,缩短数组并重试(并保持缩短并重试,直到它工作或数组为空)。

我曾尝试在返回语句周围放一个try/catch,但这不起作用 - 我怀疑是因为webservice方法成功地将数据返回给框架,但框架随后扼杀了数据。

我宁愿一个解决方案,不涉及返回一个字符串,但如果没有其他方式,我可以忍受。

[WebMethod] 
[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)] 
public MyClass[] GetMyClasses() 
{ 
    List<MyClass> lst; 
    //code that populate lst with enough instances to break the JSON. 
    return lst.ToArray(); 
} 

回答

0

,而不是试图找出产生的JSON长度,然后应用某种分页的,也许你应该总是页面数据..?

您已经知道该方法会导致大量数据,为什么不将方法更改为GetMyClasses(int skip,int take)以强制合理大小的数据块。

+0

每条记录​​的大小可能会有很大的变化,因此无法知道在不查看数据的情况下有多少记录可以提取。 还要考虑即使是一个简单的float在JSON中的大小也会有所不同(0 vs 1.2345678e234) – DJL

相关问题