web.configでmaxJsonLengthに無制限の長さを設定できますか?


663

jQueryのオートコンプリート機能を使用しています。17000を超えるレコード(長さが10文字を超えない)のリストを取得しようとすると、長さを超えてエラーがスローされます。

例外情報:
例外の種類:InvalidOperationException
例外メッセージ:JSON JavaScriptSerializerを使用したシリアル化または逆シリアル化中のエラー。文字列の長さがmaxJsonLengthプロパティで設定された値を超えています。

私はのために無制限の長さを設定することができますmaxJsonLengthではweb.config?そうでない場合、設定できる最大長はどれくらいですか?


1
かなり明白であるかもしれないことを言及するために、あなたがすでにそれを考えているなら、失礼してください。Json文字列には、各レコードを囲む中括弧、各フィールド名[および値]を囲む引用符、フィールド名と値も含まれます。したがって、フィールド名を1文字として設定し、値が文字列でない場合は、フィールドタイプを正しく設定して、引用符が含まれないようにすることも有効です。
MichaelJTaylor 2016年

回答:


720

注意:この回答はWebサービスにのみ適用されます。コントローラーメソッドからJSONを返す場合は、以下のSO回答も必ず読んでください。https//stackoverflow.com/a/7207539/1246870


MaxJsonLengthのプロパティが無制限であることができない、整数プロパティであるデフォルトは102400(100K)。

MaxJsonLengthプロパティはw​​eb.configで設定できます。

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

153
これは整数なので、設定できる最大値は2147483644
David

58
@despart:あなたは2 147 483 647を意味します。
Dercsár

6
あなたが質問を見れば、OPがされているので、@ kmcc049、IMO値が間違っていない求めていない「maxJsonLengthのデフォルト値は何ですか?」(ところで、2番目に投票された回答は、この間違った質問に回答しています)、彼はこのプロパティを「無制限」に設定しようとしていますが、は整数なので、可能な最大値は2147483647@depsartと@Descárが指摘するとおりです。
CMS

11
グレートしかし、MVCの使用して、あなたがこの問題を抱えている場合は、以下のノート@デビッド・マードックの答えreturn Json()か何か
BritishDeveloper

3
@Dercsár:ポイントは何ですか?2147483644は1024によって完全に割り切れる最大の整数である
のNaveen

461

MVC 4を使用している場合は、この回答も確認してください。


それでもエラーが発生する場合:

  • 設定後 maxJsonLengthプロパティをweb.configで最大値に
  • そして、あなたはあなたのデータの長さがこの値よりも短いことを知っています
  • JavaScriptシリアル化にWebサービスメソッドを利用していない

あなたの問題は以下の可能性があります:

MaxJsonLengthプロパティの値は、非同期通信層がWebサービスメソッドを呼び出すために使用する内部JavaScriptSerializerインスタンスにのみ適用されます。MSDN:ScriptingJsonSerializationSection.MaxJsonLengthプロパティ

基本的に、「内部」JavaScriptSerializermaxJsonLengthWebメソッドから呼び出されたときの値を尊重します。の直接使用JavaScriptSerializer(またはMVCアクションメソッド/コントローラーを介した使用)は、プロパティを尊重しません。maxJsonLength少なくとも、systemWebExtensions.scripting.webServices.jsonSerialization web.configセクション。

回避策として、コントローラー内(または実際にはどこでも)で以下を実行できます。

var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value = "foo", Text = "var" };
var result = new ContentResult{
    Content = serializer.Serialize(resultData),
    ContentType = "application/json"
};
return result;

この回答は、このasp.netフォーラムの回答に対する私の解釈です。


5
私はJson()asp.net mvcのアクション結果メソッドを使用しているので、あなたの答えは本当に役に立ちました。
jessegavin 2012年

3
うん、私もJson()で苦しんだ。ありがとう!
BritishDeveloper

3
それは完全に正しく、その場所に値するに値しますが、これは、トップの回答を過ぎて読む価値がある質問の1つです:)。ありがとう!
Nigel

3
MVC4を使用している場合は、@ fanischの回答も参照してください。
Beyers 2013年

4
逆シリアル化はどうですか?アクションのモデルバインディングでこのエラーに遭遇しました。
guogangj

345

MVC 4でできること:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

コントローラで。

添加:

指定する必要があるパラメーターに戸惑う人にとって、呼び出しは次のようになります。

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);

6
上記がMVC 4の魅力のように機能することを確認できます。
Beyers 2013年

9
確認もできます。このコードをベースコントローラ内に配置することは、提案されている最もクリーンなアプローチです。
議会

15
これは、個々のアクション結果に「MaxJsonLength = Int32.MaxValue」を追加するだけでも機能します。変更がコントローラー全体またはプロジェクト全体で望ましくない場合。
ヒプノウイルス2013

3
これが最良の答えです。MaxJsonLengthはコントローラーごとに構成できます。
リャン2014

3
警告:このソリューションは、応答の圧縮(要求された場合)を無効にします。あなたのアクションにこのフィルタを追加します。stackoverflow.com/questions/3802107/...
Gorgi Rankovski

60

web.configファイルでjsonリクエストの最大長を設定できます:

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

maxJsonLengthのデフォルト値は102400です。詳細については、次のMSDNページを参照してください。http://msdn.microsoft.com/en-us/library/bb763183.aspx


1
この整数に格納されている値は何を表していますか?これはある種の性格ですか?私が求めているのは、整数が使用されている理由ですか?ありがとう!
eaglei22 2017年

@ eaglei22数値は、maxJsonLengthに使用できるバイト数を表します。M4Nで述べたように、デフォルトは102400です(100KB)。
Jacob Plonke 2017

これは私にとっては機能せず、Webサービスも使用していません。
kalai

42

次のようなweb.config設定後もエラーが発生する場合:

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

私はそれを次のように解決しました:

   public ActionResult/JsonResult getData()
   {
      var jsonResult = Json(superlargedata, JsonRequestBehavior.AllowGet);
      jsonResult.MaxJsonLength = int.MaxValue;
      return jsonResult;
    }

これがお役に立てば幸いです。


2
web.configでmaxJsonLengthを設定することは不要です。jsonResult.MaxJsonLengthを設定するだけで十分です(少なくとも私(MVC5)の場合はそうでした)
hormberg

地球規模の変化ではないので、これは良いことです。
rob_james

40

ASP.NET Webフォームでこの問題が発生していました。web.configファイルの設定を完全に無視していたので、次のようにしました。

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

もちろん、これは全体的にひどい習慣です。Webサービス呼び出しでこれだけのデータを送信する場合は、別の方法を検討する必要があります。


1
これはあなたのために働きましたか?このコードをどこに配置しましたか?
user1012598 2015

私たちの問題は、HTMLを許可するtextareaがあり、人々が画像をHTMLとして埋め込んでいたため、エントリが非常に大きくなり、JSONシリアライザーが失敗したためです。ユーザーがそれを行うことができるかどうか私は推測します...
Marko

このコードをどこに配置するか説明してください... @Flea
Koray Durudogan

@KorayDurudogan-私はこれを応答を返していたAjaxメソッドに入れたので、コントローラーに入れました。お役に立てば幸いです。
ノミ

私はあなたの対応に挑戦していませんが、どのようなより良いアプローチがあるのか​​をよりよく理解しようとしています。ユーザーの基準に応じて結果のサイズを決定するというクエリがあります。JsonResultを返します。Excelファイルを返しても問題ありませんか?
eaglei22 2017年

22

それを私が直した。

//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

それは非常にうまく機能します。


驚くばかり!これは、地球規模の変化ではないので、私にとってはうまくいく唯一の解決策です。ありがとう!
Sealer_05 2015年

20

私は痕跡の答えに従って、この解決策を得ました:

大きなjsonをコントローラーのアクションにポストする必要がある場合、有名な「JSON JavaScriptSerializerを使用したデシリアライズ中のエラー。文字列の長さがmaxJsonLengthプロパティに設定された値を超えています。\ r \ nパラメーター名:入力値プロバイダー」。

私がしたことは、新しいValueProviderFactory、LargeJsonValueProviderFactoryを作成し、GetDeserializedObjectメソッドでMaxJsonLength = Int32.MaxValueを設定することです

public sealed class LargeJsonValueProviderFactory : ValueProviderFactory
{
private static void AddToBackingStore(LargeJsonValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value)
{
    IDictionary<string, object> dictionary = value as IDictionary<string, object>;
    if (dictionary != null)
    {
        foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>) dictionary)
            LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
    }
    else
    {
        IList list = value as IList;
        if (list != null)
        {
            for (int index = 0; index < list.Count; ++index)
                LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakeArrayKey(prefix, index), list[index]);
        }
        else
            backingStore.Add(prefix, value);
    }
}

private static object GetDeserializedObject(ControllerContext controllerContext)
{
    if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        return (object) null;
    string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd();
    if (string.IsNullOrEmpty(end))
        return (object) null;

    var serializer = new JavaScriptSerializer {MaxJsonLength = Int32.MaxValue};

    return serializer.DeserializeObject(end);
}

/// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
/// <returns>A JSON value-provider object for the specified controller context.</returns>
/// <param name="controllerContext">The controller context.</param>
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
    if (controllerContext == null)
        throw new ArgumentNullException("controllerContext");
    object deserializedObject = LargeJsonValueProviderFactory.GetDeserializedObject(controllerContext);
    if (deserializedObject == null)
        return (IValueProvider) null;
    Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);
    LargeJsonValueProviderFactory.AddToBackingStore(new LargeJsonValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>) dictionary), string.Empty, deserializedObject);
    return (IValueProvider) new DictionaryValueProvider<object>((IDictionary<string, object>) dictionary, CultureInfo.CurrentCulture);
}

private static string MakeArrayKey(string prefix, int index)
{
    return prefix + "[" + index.ToString((IFormatProvider) CultureInfo.InvariantCulture) + "]";
}

private static string MakePropertyKey(string prefix, string propertyName)
{
    if (!string.IsNullOrEmpty(prefix))
        return prefix + "." + propertyName;
    return propertyName;
}

private class EntryLimitedDictionary
{
    private static int _maximumDepth = LargeJsonValueProviderFactory.EntryLimitedDictionary.GetMaximumDepth();
    private readonly IDictionary<string, object> _innerDictionary;
    private int _itemCount;

    public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
    {
        this._innerDictionary = innerDictionary;
    }

    public void Add(string key, object value)
    {
        if (++this._itemCount > LargeJsonValueProviderFactory.EntryLimitedDictionary._maximumDepth)
            throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge");
        this._innerDictionary.Add(key, value);
    }

    private static int GetMaximumDepth()
    {
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            int result;
            if (values != null && values.Length > 0 && int.TryParse(values[0], out result))
                return result;
        }
        return 1000;
     }
  }
}

次に、Global.asax.csのApplication_Startメソッドで、ValueProviderFactoryを新しいものに置き換えます。

protected void Application_Start()
{
    ...

    //Add LargeJsonValueProviderFactory
    ValueProviderFactory jsonFactory = null;
    foreach (var factory in ValueProviderFactories.Factories)
    {
        if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory")
        {
            jsonFactory = factory;
            break;
        }
    }

    if (jsonFactory != null)
    {
        ValueProviderFactories.Factories.Remove(jsonFactory);
    }

    var largeJsonValueProviderFactory = new LargeJsonValueProviderFactory();
    ValueProviderFactories.Factories.Add(largeJsonValueProviderFactory);
}

1
私は私が、唯一のあなたの答えは私の一日を保存することができるすべてのことをした、これは答えを受け入れてきたはずです
ムハンマド・ワカスアジズ

このコードを使用すると、MVCコントローラーの最大json
デシリアライゼーション

17

上記の追加をweb.configに実装した後、「認識されない構成セクションsystem.web.extensions」が表示される場合。エラーが発生したら、これを<ConfigSections>セクションのweb.configに追加してください:

            <sectionGroup name="system.web.extensions" type="System.Web.Extensions">
              <sectionGroup name="scripting" type="System.Web.Extensions">
                    <sectionGroup name="webServices" type="System.Web.Extensions">
                          <section name="jsonSerialization" type="System.Web.Extensions"/>
                    </sectionGroup>
              </sectionGroup>
        </sectionGroup>

4
私はこの問題を抱えていました。しかし、この答えは私にはうまくいきませんでした。ここで説明した<sectionGroup>要素を追加する代わりに、新しく追加した<system.web.extensions>ブロック全体を、</ configuration>の直前にあるweb.configの最後に移動しました。その後、うまくいきました。
ClearCloud8

これは役に立ちましたが、私の状況では<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>、このページにあるように、4行目をに変更する必要がありました。forums.asp.net
Nathan

@ ClearCloud8すぐにこのページ全体に広がるコメントを取得します。
Jack Nutkins、2016年

11

この行をコントローラーに書き込むことができます

json.MaxJsonLength = 2147483644;

次の行に書き込むこともできます web.config

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

`

安全のために、両方を使用してください。


10

MVC のMiniProfilerからこのエラーが発生した場合は、プロパティMiniProfiler.Settings.MaxJsonResponseSizeを目的の値に設定することで値を増やすことができます。デフォルトでは、このツールは設定で設定された値を無視するようです。

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

礼儀mvc-mini-profiler



9

Int32.MaxValueに設定することをお勧めします。

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;

9

いくつかの属性魔法はどうですか?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MaxJsonSizeAttribute : ActionFilterAttribute
{
    // Default: 10 MB worth of one byte chars
    private int maxLength = 10 * 1024 * 1024;

    public int MaxLength
    {
        set
        {
            if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0.");

            maxLength = value;
        }
        get { return maxLength; }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        JsonResult json = filterContext.Result as JsonResult;
        if (json != null)
        {
            if (maxLength == 0)
            {
                json.MaxJsonLength = int.MaxValue;
            }
            else
            {
                json.MaxJsonLength = maxLength;
            }
        }
    }
}

次に、グローバルフィルター構成を使用してグローバルに適用するか、コントローラー/アクションごとに適用できます。


すばらしい答えです。カスタム属性の素晴らしい使い方。デフォルトをMax(int.MaxValue)ではなく10 MBに相当する1バイト文字に設定する特定の(技術的な)理由があるかどうか疑問に思いますか?
ジョシュ

@ジョシュいいえ、そのための特別な理由はありませんでした。
バラージュ

5

問題は本当に17000レコードを返す必要があるかどうかです。ブラウザですべてのデータをどのように処理する予定ですか?とにかく、ユーザーは17000行をスクロールしません。

より優れたアプローチは、「上位の少数」のレコードのみを取得し、必要に応じてさらに読み込むことです。


1
jsonのデフォルトのリストは17000レコードを提供します。ただし、オートコンプリート機能では、ユーザーが入力した文字と一致するレコードのみが一覧表示されるため、リストをさらにスクロールする必要はありません。SOが必要なのは、17kデータをシリアル化できるmaxJsonLengthに無制限の長さを設定することです。
Prasad

6
サーバー側とクライアント側のフィルタリングを組み合わせて使用​​できます。ネットワークの待ち時間は言うまでもなく、クライアント側ですべてのデータをフィルタリングするのは難しい場合があります。
Chetan Sastry、

1
しばらく前に同じ問題が発生したため、オートコンプリートの「onsearch」ハンドラーを実装することを選択し、Webサービス呼び出しに「search」テキストを渡し、検索基準をフィルターとして使用してTop10クエリを実行させました。これは、ページの読み込みに関する完全なリストを取得するだけの、より個別のajaxリクエストを意味しましたが、すべてのリクエスト/レスポンスがはるかに小さいことも意味しました。
Mike U

3

他の人が言ったように、設定で設定することも、次のようにシリアライザの個々のインスタンスに設定することもできます。

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };

3

モデルバインダー用に自動的に逆シリアル化され、大きすぎるJSONを使用するMVC3で問題が発生している場合は、次の解決策があります。

  1. JsonValueProviderFactoryクラスのコードをMVC3ソースコードから新しいクラスにコピーします。
  2. オブジェクトがデシリアライズされる前に、JSONの最大長を変更する行を追加します。
  3. JsonValueProviderFactoryクラスを、新しく変更されたクラスに置き換えます。

これを行う方法について正しい方向を教えてくれたhttp://blog.naver.com/techshare/100145191355およびhttps://gist.github.com/DalSoft/1588818に感謝します。最初のサイトの最後のリンクには、ソリューションの完全なソースコードが含まれています。


3

Viewでこの種の問題が発生した場合は、以下の方法を使用して解決できます。ここIused Newtonsoftのパッケージを。

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>

これは、Json.NETを使用する場合、最大長を気にする必要がないことを意味しますか?Json.NETに最大長を設定する方法はないと思いますので、そのままで動作することを願っています。
kimbaudi 2017年

1
すばらしい回答ありがとうございます!これは、オブジェクトをロードしようとしたときにも機能しました。
user1299379

3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;

2

「無制限」の値はないようです。デフォルトは2097152文字で、4 MBのUnicode文字列データに相当します。

すでに観察されているように、17,000レコードはブラウザーでうまく使用することが困難です。集約ビューを表示している場合は、サーバーで集約を行い、ブラウザで概要のみを転送する方がはるかに効率的です。たとえば、ファイルシステムブラウザーについて考えてみましょう。ツリーの最上位のみが表示され、ドリルダウンするとさらにリクエストが発行されます。各リクエストで返されるレコードの数は比較的少ないです。ツリービュープレゼンテーションは、大規模な結果セットに適しています。


3
奇妙なことに、コードのデフォルト(新しいJavaScriptSerializer())です。MaxJsonLengthは2097152バイトですが、明示的に設定しない限り、WebサービスのResponseFormatJsonは102400バイトです。
rob

2

ちょうどこれに遭遇しました。6,000件以上のレコードを取得しています。ちょうどページングをするだけだと決めました。同様に、MVC JsonResultエンドポイントのページ番号を受け入れます。デフォルトでは0に設定されているため、次のように必要ありません。

public JsonResult MyObjects(int pageNumber = 0)

次に言う代わりに:

return Json(_repository.MyObjects.ToList(), JsonRequestBehavior.AllowGet);

私は言う:

return Json(_repository.MyObjects.OrderBy(obj => obj.ID).Skip(1000 * pageNumber).Take(1000).ToList(), JsonRequestBehavior.AllowGet);

とても簡単です。次に、JavaScriptでは、これの代わりに:

function myAJAXCallback(items) {
    // Do stuff here
}

代わりに私は言う:

var pageNumber = 0;
function myAJAXCallback(items) {
    if(items.length == 1000)
        // Call same endpoint but add this to the end: '?pageNumber=' + ++pageNumber
    }
    // Do stuff here
}

そして、そもそもあなたがレコードを使っていたものにレコードを追加します。または、すべての通話が終了して結果をまとめるまで待つだけです。


2

私はこのコードを追加する問題を解決しました:

String confString = HttpContext.Current.Request.ApplicationPath.ToString();
Configuration conf = WebConfigurationManager.OpenWebConfiguration(confString);
ScriptingJsonSerializationSection section = (ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization");
section.MaxJsonLength = 6553600;
conf.Save();

これはハッキーなソリューションのようですが、興味深いアプローチです。お役に立ててありがとうございます!私にとってapsnet mvc 5コントローラーでは、名前空間から 'Current'を削除する必要がありました。私はいくつかの調整を行いました:string confString = HttpContext.Request.ApplicationPath.ToString(); var conf = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(confString); var section = (System.Web.Configuration.ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization"); section.MaxJsonLength = int.MaxValue; conf.Save();
ooXei1sh 2016年

2

代替ASP.NET MVC 5修正:

(Mineは上記のMFCの回答に似ていますが、いくつかの小さな変更があります)

まだJson.NETに変更する準備ができていませんでした。私の場合、リクエスト中にエラーが発生していました。私のシナリオでの最良のアプローチJsonValueProviderFactoryは、修正をグローバルプロジェクトに適用する実際のglobal.csファイルを変更することでした。

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

web.configエントリを追加します。

<add key="aspnet:MaxJsonLength" value="20971520" />

次の2つのクラスを作成します

public class JsonValueProviderConfig
{
    public static void Config(ValueProviderFactoryCollection factories)
    {
        var jsonProviderFactory = factories.OfType<JsonValueProviderFactory>().Single();
        factories.Remove(jsonProviderFactory);
        factories.Add(new CustomJsonValueProviderFactory());
    }
}

これは基本的に、にあるデフォルトの実装の正確なコピーですSystem.Web.Mvcが、構成可能なweb.config appsetting値が追加されていますaspnet:MaxJsonLength

public class CustomJsonValueProviderFactory : ValueProviderFactory
{

    /// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
    /// <returns>A JSON value-provider object for the specified controller context.</returns>
    /// <param name="controllerContext">The controller context.</param>
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        if (controllerContext == null)
            throw new ArgumentNullException("controllerContext");

        object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext);
        if (deserializedObject == null)
            return null;

        Dictionary<string, object> strs = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject);

        return new DictionaryValueProvider<object>(strs, CultureInfo.CurrentCulture);
    }

    private static object GetDeserializedObject(ControllerContext controllerContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd();
        if (string.IsNullOrEmpty(fullStreamString))
            return null;

        var serializer = new JavaScriptSerializer()
        {
            MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength()
        };
        return serializer.DeserializeObject(fullStreamString);
    }

    private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value)
    {
        IDictionary<string, object> strs = value as IDictionary<string, object>;
        if (strs != null)
        {
            foreach (KeyValuePair<string, object> keyValuePair in strs)
                CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);

            return;
        }

        IList lists = value as IList;
        if (lists == null)
        {
            backingStore.Add(prefix, value);
            return;
        }

        for (int i = 0; i < lists.Count; i++)
        {
            CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]);
        }
    }

    private class EntryLimitedDictionary
    {
        private static int _maximumDepth;

        private readonly IDictionary<string, object> _innerDictionary;

        private int _itemCount;

        static EntryLimitedDictionary()
        {
            _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth();
        }

        public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
        {
            this._innerDictionary = innerDictionary;
        }

        public void Add(string key, object value)
        {
            int num = this._itemCount + 1;
            this._itemCount = num;
            if (num > _maximumDepth)
            {
                throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property.");
            }
            this._innerDictionary.Add(key, value);
        }
    }

    private static string MakeArrayKey(string prefix, int index)
    {
        return string.Concat(prefix, "[", index.ToString(CultureInfo.InvariantCulture), "]");
    }

    private static string MakePropertyKey(string prefix, string propertyName)
    {
        if (string.IsNullOrEmpty(prefix))
        {
            return propertyName;
        }
        return string.Concat(prefix, ".", propertyName);
    }

    private static int GetMaximumDepth()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }

    private static int GetMaxJsonLength()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonLength");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }
}

1
おかげでそれは働いています... @Maxim Gershkovichに感謝します
Jasper Manickaraj

1

WebForms UpdatePanelのソリューション:

Web.configに設定を追加します。

<configuration>
  <appSettings>
    <add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
  </appSettings>
</configuration>

https://support.microsoft.com/en-us/kb/981884

ScriptRegistrationManager クラスには次のコードが含まれます:

// Serialize the attributes to JSON and write them out
JavaScriptSerializer serializer = new JavaScriptSerializer();

// Dev10# 877767 - Allow configurable UpdatePanel script block length
// The default is JavaScriptSerializer.DefaultMaxJsonLength
if (AppSettings.UpdatePanelMaxScriptLength > 0) {
    serializer.MaxJsonLength = AppSettings.UpdatePanelMaxScriptLength;
}  

string attrText = serializer.Serialize(attrs);

1

サーバー側の変更は必要ありません。あなたはこれを修正することができますweb.configファイルによってのみ変更する これは私のために役立ちました。これを試してください

<appSettings>
 <add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />
<add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
</appSettings>  

and   

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



0

ASP.NET MVCの修正:問題を引き起こしている特定のアクションに対してのみ修正したい場合は、次のようにコーディングします。

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return Json(someBigObject);
}

これに変更できます:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return new JsonResult()
    {
        Data = someBigObject,
        JsonRequestBehavior = JsonRequestBehavior.DenyGet,
        MaxJsonLength = int.MaxValue
    };
}

機能は同じである必要があります。より大きなJSONを応答として返すことができます。


ASP.NET MVCソースコードに基づく説明:ASP.NET MVCソースコードでどのController.Jsonメソッドが実行するかを確認できます

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

それは他のController.Jsonメソッドを呼び出しています:

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

渡さcontentTypeれたcontentEncodingオブジェクトはnullです。したがって、基本的return Json(object)にコントローラーを呼び出すことはを呼び出すことと同じreturn new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }です。2番目のフォームとparameterizeを使用できますJsonResult

では、MaxJsonLengthプロパティを設定するとどうなりますか(デフォルトではnullです)。それはだ受け継がJavaScriptSerializer.MaxJsonLengthプロパティ、その後JavaScriptSerializer.Serialize方法がされて呼ばれます

JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
    serializer.MaxJsonLength = MaxJsonLength.Value;
}

if (RecursionLimit.HasValue)
{
    serializer.RecursionLimit = RecursionLimit.Value;
}

response.Write(serializer.Serialize(Data));

そしてMaxJsonLenght、シリアライザのプロパティを設定しない場合、それはちょうど2MBであるデフォルト値取り ます


-2

このmaxJsonLengthの値がintの場合、そのintの大きさは32ビット/ 64ビット/ 16ビットです。...maxJsonLengthとして設定できる最大値を確認したいだけです。

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>

-4

web.configを使用する必要はありません。渡すリストの値をキャッチするときにshortプロパティを使用できます。たとえば、次のようなモデルを宣言します。

public class BookModel
    {
        public decimal id { get; set; }  // 1 

        public string BN { get; set; } // 2 Book Name

        public string BC { get; set; } // 3 Bar Code Number

        public string BE { get; set; } // 4 Edition Name

        public string BAL { get; set; } // 5 Academic Level

        public string BCAT { get; set; } // 6 Category
}

ここでは、BC =バーコードBE =ブックエディションなどの短いプロポーティを使用します。


データの大部分がプロパティ値に含まれている場合、これは役に立ちません
ウィンドウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.