1

まず、このエラーの意味を知っていると言うことから始めましょう。私は知っています <jsonSerialization maxJsonLength="50000000"/> そして私は制限がある理由を(私の意見では非常に良い)理解しています。

そのため、.NET ScriptManagerを使用してjavascriptからWebサービスを呼び出し、すべてのクライアントコードを作成しています。

WebサービスはSQLから大量のデータを取得し、それをオブジェクトの配列に変換してから、この配列を返します。

内部的には、.NETエンジンは、この配列をクライアントに送信するためのJSON配列に変換します。

ただし、結果のJSON文字列が長すぎて、例外がスローされる場合があります。

このエラーを検出して適切に処理する一般的な方法が必要です(たとえば、残りを取得するために別の後続の要求を行う必要があることを示すインジケーターを使用してデータの一部を送信することによって)

私がしたくないのは、json文字列の長さに空の上限を設定することです。これにより、クライアントがすべてのデータを取得するまでに非常に長い時間がかかる可能性があります。この設定の上限は2147483644、つまり2GBだと思います。クライアントが、JavaScriptエンジンを解析しようとしたときに、データがちょうど間に合うように到着するまでに、退屈してさまよっている可能性があります。

したがって、私が本当に求めているのは、結果のjson文字列が返される前に「知る」方法であり、適切に切り捨てられるようにするか、結果のエラーを処理し、配列を短くして再試行する方法だと思います。 (そして、それが機能するか、配列が空になるまで、短縮して再試行し続けます)。

returnステートメントの周りにtry/catchを配置しようとしましたが、これは機能しませんでした。Webサービスメソッドがデータをフレームワークに正常に返しているのに、フレームワークがデータをチョークしているためと思われます。

文字列を返す必要のないソリューションが望ましいのですが、他に方法がない場合はそれを我慢できます。

[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 に答える