web-dev-qa-db-ja.com

JavaScriptSerializer.MaxJsonLengthを超えました。これを処理するためのベストプラクティスは何ですか?

JQueryの$ .ajax()関数を使用してクライアントに送信する大量のデータがあります。 JSONデータを返すASP.NETWebサービスのメソッドを呼び出しています。ほとんどの検索ですべてがうまくいきますが、返す大きなデータセットがあると、JavaScriptSerializerMaxJsonLengthプロパティで問題が発生します。これを処理するためのベストプラクティスは何ですか?最大長を任意に設定したくありません。返されるデータが現在の最大値よりも大きい場合、WebサービスでMaxJsonLengthを設定できますか、それともデータのチャックを書き直してクライアントに送信する必要がありますか?

Webサービスからの関連スニペットは次のとおりです。

Dictionary<string, object> jsonValuePairs = new Dictionary<string, object>();
//add some data to the dictionary...
return System.Web.Script.Serialization.JavaScriptSerializer.Serialize(jsonValuePairs);
16
Tim Scarborough

クライアントスクリプトから呼び出されるWebメソッドの最大長を設定する唯一の方法は、web.configファイル(以下)を使用することです。これを設定する際の問題は何ですか?データの一部をストリーミングするために、複数のxhr呼び出しで毎回これを行います。

<system.web.extensions>
  <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="500000">
        </jsonSerialization>
      </webServices>
  </scripting>
</system.web.extensions>

更新:デフォルトサイズは2097152で、これは4MBのUnicode文字列データに相当します。本当にそれだけのデータをクライアントに送り返すつもりですか?もしそうなら、ユーザーエクスペリエンスが遅くて面倒になるので、おそらくアプリのデザインを見る必要があります。

34
redsquare

2147483647は使用する正しい値です。コードの混乱を避けるために、次のようなものを使用できます

var JsonSerializer = new JavaScriptSerializer();
JsonSerializer.MaxJsonLength = Int32.MaxValue;
11
DJ'

このフォーラム投稿 によると、このプロパティの最大値は2147483647です。

私はまだ返すデータの最適化に時間を費やしていません(誰かがそれを見る前にそれを行います)-しかし、この値を設定すると、IEは私にスクリプトを与え始めましたページのメッセージに時間がかかりすぎています。

解決策はデータをチャンク化することです-誰かがこれを行うための素晴らしい方法を知っていますか(理想的にはjQueryで)?もちろん、成功ハンドラーで別のajax呼び出しを行うこともできます。

5
Ian Grainger

許可される最大長は、整数が保持できる最大値であり、たまたま-2147483647です。

3
user2704583

このスニペットをweb.configに追加します。

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="2147483647"/>
  </webServices>
</scripting>

そしてあなたのc#コードで:

 JavaScriptSerializer jss = new JavaScriptSerializer();
 jss.MaxJsonLength = Int32.MaxValue;
 ...
 ...
0
Amit