1

首先让我先说我知道这个错误意味着什么。我知道 <jsonSerialization maxJsonLength="50000000"/> 并且我理解(在我看来,非常好的)限制的原因。

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

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

在后台,.NET 引擎将此数组转换为 JSON 数组以发送到客户端。

然而,有时生成的 JSON 字符串太长并且会引发异常。

我想要一些通用的方法来检测这个错误并优雅地处理它(例如,通过发送一些带有指示符的数据,表明应该发出另一个后续请求来获取其余部分)

我不想做的是对 json 字符串的长度设置一个很高的限制,因为这可能导致客户端需要很长时间才能获取所有数据。我相信这个设置的上限是 2147483644,即 2GB。当所有数据及时到达时,客户端可能已经厌倦并迷失了方向,从而在尝试解析它时使 javascript 引擎崩溃。

所以我想我真正追求的是一种方法来“知道”生成的 json 字符串在返回之前将有多长,以便可以适当截断它,或者以某种方式处理生成的错误,缩短数组并重试(并不断缩短并重试,直到它起作用或数组为空)。

我尝试在 return 语句周围放置一个 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();
}
4

1 回答 1

0

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

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

于 2013-01-11T14:45:22.243 回答