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);
クライアントスクリプトから呼び出されるWebメソッドの最大長を設定する唯一の方法は、web.configファイル(以下)を使用することです。これを設定する際の問題は何ですか?データの一部をストリーミングするために、複数のxhr呼び出しで毎回これを行います。
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="500000">
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>
更新:デフォルトサイズは2097152で、これは4MBのUnicode文字列データに相当します。本当にそれだけのデータをクライアントに送り返すつもりですか?もしそうなら、ユーザーエクスペリエンスが遅くて面倒になるので、おそらくアプリのデザインを見る必要があります。
2147483647
は使用する正しい値です。コードの混乱を避けるために、次のようなものを使用できます
var JsonSerializer = new JavaScriptSerializer();
JsonSerializer.MaxJsonLength = Int32.MaxValue;
このフォーラム投稿 によると、このプロパティの最大値は2147483647です。
私はまだ返すデータの最適化に時間を費やしていません(誰かがそれを見る前にそれを行います)-しかし、この値を設定すると、IEは私にスクリプトを与え始めましたページのメッセージに時間がかかりすぎています。
解決策はデータをチャンク化することです-誰かがこれを行うための素晴らしい方法を知っていますか(理想的にはjQueryで)?もちろん、成功ハンドラーで別のajax呼び出しを行うこともできます。
許可される最大長は、整数が保持できる最大値であり、たまたま-2147483647です。
このスニペットをweb.configに追加します。
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647"/>
</webServices>
</scripting>
そしてあなたのc#コードで:
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.MaxJsonLength = Int32.MaxValue;
...
...