क्या मैं web.config में maxJsonLength के लिए असीमित लंबाई निर्धारित कर सकता हूं?


663

मैं jQuery के स्वत: पूर्ण सुविधा का उपयोग कर रहा हूं। जब मैं १ 17००० से अधिक रिकॉर्ड की सूची प्राप्त करने की कोशिश करता हूं (प्रत्येक में १० से अधिक चार लंबाई नहीं होगी), यह लंबाई से अधिक है और त्रुटि को फेंकता है:

अपवाद की जानकारी:
अपवाद प्रकार: InvalidOperationException
अपवाद संदेश: JSON JavaScriptSerializer का उपयोग करके क्रमांकन या डीरिएलाइज़ेशन के दौरान त्रुटि। स्ट्रिंग की लंबाई maxJsonLength संपत्ति पर निर्धारित मूल्य से अधिक है।

मैं के लिए एक असीमित लंबाई निर्धारित कर सकते हैं maxJsonLengthमें web.config? यदि नहीं, तो मैं अधिकतम कितनी लंबाई निर्धारित कर सकता हूं?


1
कुछ का उल्लेख करने के लिए जो बहुत स्पष्ट हो सकता है इसलिए कृपया मुझे क्षमा करें यदि आपने पहले ही सोचा है कि अगर यह; Json string में प्रत्येक रिकॉर्ड के आसपास घुंघराले कोष्ठक, प्रत्येक क्षेत्र के नाम के आसपास उद्धरण चिह्न [और मूल्य], साथ ही फ़ील्ड नाम और मान भी शामिल हैं। इसलिए फ़ील्ड नाम को एकल वर्ण के रूप में सेट करना उपयोगी हो सकता है और यह भी सुनिश्चित करें कि यदि मान स्ट्रिंग नहीं है, तो आप फ़ील्ड प्रकार को सही तरीके से सेट करते हैं, ताकि उसमें उद्धरण चिह्न न हों।
माइकलजयलर

जवाबों:


719

नोट: यह उत्तर केवल वेब सेवाओं पर लागू होता है, यदि आप JSON को नियंत्रक विधि से वापस कर रहे हैं, तो सुनिश्चित करें कि आपने इस SO उत्तर को नीचे भी पढ़ा है: https://stackoverflow.com/a/7207539/1246870


MaxJsonLength संपत्ति असीमित नहीं हो सकता, एक पूर्णांक संपत्ति है कि चूक करने के लिए 102,400 (100k)।

आप MaxJsonLengthसंपत्ति को अपने web.config पर सेट कर सकते हैं:

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

153
यह एक पूर्णांक है, जिससे अधिकतम मूल्य निर्धारित किया जा सकता है: 2147483644
डेविड एस्पार्ट सेप

57
@despart: तुम्हारा मतलब 2 147 483 647
Dercsár

6
@ kmcc049, IMO मान गलत नहीं हैं क्योंकि यदि आप प्रश्न को देखते हैं, तो ओपी यह नहीं पूछ रहा है कि " अधिकतम मान का अधिकतम मान क्या है?" (BTW, दूसरा सबसे अधिक वोट दिया गया जवाब यह, गलत सवाल है), वह इस संपत्ति को "असीमित" पर सेट करने की कोशिश कर रहा है, लेकिन चूंकि एक इंटगर है , अधिकतम संभव मूल्य 2147483647@depsart और @ Descár बताते हैं।
सीएमएस

11
महान लेकिन ध्यान दें @ डेविड मर्डोक के नीचे का जवाब अगर आपको एमवीसी return Json()या कुछ और का उपयोग करते समय यह समस्या है
BritishDeveloper

3
@ Dercsár: क्या बात है? 2147483644 सबसे बड़ी पूर्णांक पूरी तरह से 1024 से विभाज्य है
नवीन

461

यदि आप MVC 4 का उपयोग कर रहे हैं , तो इस उत्तर को भी देखना सुनिश्चित करें ।


यदि आप अभी भी त्रुटि प्राप्त कर रहे हैं:

  • maxJsonLengthसंपत्ति को web.config में उसके अधिकतम मूल्य पर सेट करने के बाद
  • और आप जानते हैं कि आपके डेटा की लंबाई इस मान से कम है
  • और आप जावास्क्रिप्ट क्रमांकन के लिए एक वेब सेवा पद्धति का उपयोग नहीं कर रहे हैं

आपकी समस्या की संभावना है कि:

MaxJsonLength गुण का मान केवल आंतरिक JavaScriptSerializer उदाहरण पर लागू होता है जो वेब सेवाओं के तरीकों को लागू करने के लिए अतुल्यकालिक संचार परत द्वारा उपयोग किया जाता है। ( MSDN: ScriptingJsonSerializationSection.MaxJsonLength संपत्ति )

मूल रूप से, "आंतरिक" वेब विधि से कॉल किए जाने पर JavaScriptSerializerमूल्य का सम्मान करता है maxJsonLength; JavaScriptSerializer(MVC एक्शन-मेथड / कंट्रोलर के माध्यम से उपयोग) का प्रत्यक्ष उपयोग संपत्ति का सम्मान नहीं करता maxJsonLengthहै, कम से कम systemWebExtensions.scripting.webServices.jsonSerializationweb.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 में एक्शन परिणाम विधि का उपयोग कर रहा हूं ।
जेजेगाविन

3
हां, मैं एक जसन () पीड़ित था। धन्यवाद!
ब्रिटिशडायलर

3
यद्यपि यह पूरी तरह से सही है और अपनी जगह के योग्य है, यह उन सवालों में से एक है जहां यह शीर्ष उत्तर के अतीत को पढ़ने लायक है :)। धन्यवाद!
निगेल

3
यदि आप MVC4 का उपयोग कर रहे हैं तो कृपया @fanisch उत्तर भी देखें।
Beyers

4
Deserialization के बारे में कैसे? मुझे यह त्रुटि एक्शन के मॉडल बाइंडिंग में मिली।
गुगंज

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
मैं पुष्टि कर सकता हूं कि उपरोक्त एमवीसी 4 में एक आकर्षण की तरह काम करता है, आपको धन्यवाद।
बेयर्स

9
मैं भी पुष्टि कर सकता हूँ। आधार कोड के अंदर इस कोड को डालना निश्चित रूप से सबसे साफ दृष्टिकोण है।
पार्लियामेंट

15
यह भी केवल "MaxJsonLength = Int32.MaxValue" को व्यक्तिगत एक्शन परिणाम में जोड़कर काम करता है। मामले में परिवर्तन वांछित नियंत्रक या परियोजना विस्तृत नहीं है।
Hypnovirus

3
यह सबसे अच्छा जवाब है। MaxJsonLength नियंत्रक प्रति कॉन्फ़िगर किया जा सकता है।
लियांग

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>

अधिकतम मान के लिए डिफ़ॉल्ट मान 102400 है । अधिक जानकारी के लिए, इस MSDN पृष्ठ को देखें: http://msdn.microsoft.com/en-us/library/bb763183.aspx


1
इस पूर्णांक का प्रतिनिधित्व करने में संग्रहीत मूल्य क्या है? यह चरित्र की गिनती के कुछ प्रकार है? मुझे लगता है कि मैं जो पूछ रहा हूं वह यह है कि एक पूर्णांक का उपयोग क्यों किया जा रहा है? धन्यवाद!
ईगलिई

@ eaglei22 यह दर्शाता है कि अधिकतम बाइट्स का अधिकतम उपयोग कैसे किया जा सकता है। जैसा कि M4N ने उल्लेख किया है, 102400 डिफ़ॉल्ट (100KB) है।
जैकब प्लॉनके

यह मेरे लिए काम नहीं किया है और मैं webservices का उपयोग नहीं किया है।
कलई

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 सेट करना unnesseary है, jsonResult.MaxJsonLength सेट करना (कम से कम यह मेरे लिए (MVC5)) पर्याप्त होना चाहिए
हार्मोनबर्ग

यह अच्छा है क्योंकि यह वैश्विक परिवर्तन नहीं है।
लूट_जाम

40

मुझे ASP.NET वेब फॉर्म में यह समस्या आ रही थी। यह पूरी तरह से web.config फ़ाइल सेटिंग्स को अनदेखा कर रहा था इसलिए मैंने ऐसा किया:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

बेशक कुल मिलाकर यह भयानक प्रथा है। यदि आप एक वेब सेवा कॉल में यह बहुत अधिक डेटा भेज रहे हैं तो आपको एक अलग दृष्टिकोण देखना चाहिए।


1
क्या यह आपके लिए काम करता है? आपने यह कोड कहां रखा है?
user1012598

हमारी समस्या इसलिए थी क्योंकि हमारे पास एक टेक्स्टरी था जो HTML के लिए अनुमति देता था और लोग HTML के रूप में छवियों को एम्बेड कर रहे थे जिसके कारण प्रविष्टि बहुत बड़ी हो गई थी और JSON धारावाहिक विफल हो गया था। मुझे लगता है कि अगर यह किया जा सकता है तो उपयोगकर्ता इसे करेंगे ...
मार्को

कृपया वर्णन करें कि हमें यह कोड कहां रखना चाहिए ... @Flea
Koray Durudogan

@ कोरयूरुद्दोगन - मैंने इसे अजाक्स विधि में डाला जो प्रतिक्रिया लौटा रहा था, इसलिए मेरे नियंत्रक में। उम्मीद है की वो मदद करदे!
पिस्सू

मैं आपकी प्रतिक्रिया को चुनौती नहीं दे रहा हूं, लेकिन बेहतर दृष्टिकोण प्राप्त करने की कोशिश कर रहा हूं। मेरे पास एक क्वेरी है जो उपयोगकर्ता के मानदंड के आधार पर परिणाम का आकार निर्धारित करेगी। मैं एक JsonResult लौटाता हूँ, अगर मैं एक एक्सेल फाइल लौटाऊं तो यह बात होगी?
eaglei22

22

मैंने ठीक कर दिया।

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

ये अच्छी तरह काम करता है।


बहुत बढ़िया! यह एकमात्र समाधान है जिसने वैश्विक परिवर्तन नहीं होने के बाद से मेरे और इसके बेहतर रास्ते के लिए काम किया है। धन्यवाद!
सीलर_05

20

मैंने वेस्टेजल के उत्तर का पालन किया और इस समाधान के लिए गया:

जब मुझे एक नियंत्रक में एक बड़े json को एक पोस्ट करने की आवश्यकता होती है, तो मुझे JSON JavaScriptSerializer का उपयोग करते हुए deserialization के दौरान प्रसिद्ध "त्रुटि प्राप्त होगी। स्ट्रिंग की लंबाई maxJsonLength गुण पर सेट मान से अधिक है। \ r \ n \ n पैरामीटर नाम: इनपुट। मूल्य प्रदाता ”।

मैंने जो किया वह एक नया ValueProviderFactory, BigJsonValueProviderFactory बना, और 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 पद्धति में, मान को बदलें PoviderFactory नए के साथ:

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 Deserializetion लिमिट को 4 mb से ओवरराइड करने में सक्षम हैं, लेकिन क्या वेब-एपीआई कंट्रोलर अधिकतम json Deserializetion लिमिट से आगे निकलने का एक तरीका है
मुहम्मद वक़ील अज़ीज़

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> ब्लॉक किया है ।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"/>, जैसा कि इस पृष्ठ पर देखा गया है: forum.asp.net/t/1446510.aspx/1
नाथन

@ ClearCloud8 इस टिप्पणी को तुरंत इस पृष्ठ पर फैलाएं।
जैक नटकिंस

11

आप इस लाइन को नियंत्रक में लिख सकते हैं

json.MaxJsonLength = 2147483644;

आप इस लाइन को भी लिख सकते हैं web.config

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

`

सुरक्षित पक्ष पर होने के लिए, दोनों का उपयोग करें।


10

यदि आपको MVC में मिनीप्रोफाइलर से यह त्रुटि मिल रही है तो आप संपत्ति MiniProfiler.Settings.MaxJsonResponseSizeको वांछित मूल्य पर सेट करके मूल्य बढ़ा सकते हैं । डिफ़ॉल्ट रूप से, यह उपकरण कॉन्फ़िगरेशन में निर्धारित मान को अनदेखा करता है।

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

सौजन्य MVC-मिनी प्रोफाइलर


10

बस MVC की एक्शन विधि में MaxJsonLength की शुद्धता निर्धारित करें

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;

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;
            }
        }
    }
}

तब आप वैश्विक फ़िल्टर कॉन्फ़िगरेशन या नियंत्रक / क्रिया-वार का उपयोग करके या तो इसे विश्व स्तर पर लागू कर सकते थे।


बहुत बढ़िया जवाब। कस्टम विशेषताओं का अच्छा उपयोग। आश्चर्य है कि क्या कोई विशिष्ट (तकनीकी) कारण है कि आपने अधिकतम (ब.मैक्सवैल्यू) के स्थान पर डिफ़ॉल्ट रूप से एक बाइट चार्ट के 10 एमबी मूल्य निर्धारित किए हैं?
जोश

@ जोश नहीं, उसके लिए कोई विशेष कारण नहीं था।
बालज्स

5

वास्तव में सवाल यह है कि क्या आपको वास्तव में 17k रिकॉर्ड वापस करने की आवश्यकता है? आप ब्राउज़र के सभी डेटा को कैसे संभालने की योजना बना रहे हैं? उपयोगकर्ता वैसे भी 17000 पंक्तियों के माध्यम से स्क्रॉल नहीं करने जा रहे हैं।

एक बेहतर तरीका केवल "शीर्ष कुछ" रिकॉर्ड प्राप्त करना है और आवश्यकता के अनुसार अधिक लोड करना है।


1
Json से डिफ़ॉल्ट सूची 17k रिकॉर्ड देगी। लेकिन स्वत: पूर्ण सुविधा केवल उन अभिलेखों को सूचीबद्ध करेगी जो उपयोगकर्ता के प्रकारों से मेल खाते हैं, इस प्रकार यह सूची को अधिक स्क्रॉल करने की आवश्यकता नहीं है। तो मुझे जो अधिकतम जरूरत है वह अधिकतम लंबाई के लिए सेट करना है।
प्रसाद

6
आप सर्वर और क्लाइंट साइड फ़िल्टरिंग के संयोजन का उपयोग कर सकते हैं। क्लाइंट की ओर से सभी डेटा को फ़िल्टर करना मुश्किल हो सकता है, नेटवर्क विलंबता का उल्लेख नहीं करना।
चेतन शास्त्री

1
थोड़ी देर पहले इसी मुद्दे पर आने के बाद, मैंने स्वत: पूर्ण के लिए "ऑन्सरशीट" हैंडलर को लागू करने के लिए चुना, और वेब सेवा कॉल को "खोज" पाठ पास कर दिया और खोज मानदंड का उपयोग करके फ़िल्टर के रूप में टॉप 10 क्वेरी करना। इसका मतलब अधिक व्यक्तिगत अजाक्स अनुरोध है, कि पेज लोड पर पूरी सूची मिल रही है, लेकिन इसका मतलब यह भी था कि सभी अनुरोध / प्रतिक्रियाएं बहुत छोटी थीं ।
माइक यू

3

आप इसे कॉन्फ़िगर कर सकते हैं जैसा कि अन्य लोगों ने कहा है, या आप धारावाहिक के एक व्यक्तिगत उदाहरण पर सेट कर सकते हैं जैसे:

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

3

उन लोगों के लिए जो JVC के साथ MVC3 में समस्या कर रहे हैं, जो स्वचालित रूप से एक मॉडल बाइंडर के लिए deserialized है और बहुत बड़ा है, यहाँ एक समाधान है।

  1. JVCValueProviderFactory वर्ग के लिए MVC3 स्रोत कोड से एक नई कक्षा में कोड कॉपी करें।
  2. ऑब्जेक्ट के असत्य होने से पहले अधिकतम JSON लंबाई बदलने के लिए एक पंक्ति जोड़ें।
  3. अपने नए, संशोधित वर्ग के साथ JsonValueProviderFactory वर्ग को बदलें।

यह करने के लिए मुझे सही दिशा में इंगित करने के लिए http://blog.naver.com/techshare/100145191355 और https://gist.github.com/DalSoft/1588818 का धन्यवाद । पहली साइट पर अंतिम लिंक में समाधान के लिए पूर्ण स्रोत कोड होता है।


3

यदि आप दृश्य में इस प्रकार की समस्या का सामना कर रहे हैं, तो आप इसे हल करने के लिए नीचे दी गई विधि का उपयोग कर सकते हैं। यहाँ पर मैंने न्यूटनसॉफ्ट पैकेज तैयार किया।

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

इसका मतलब यह है कि अगर मैं Json.NET का उपयोग करता हूं तो मुझे अधिकतम लंबाई के बारे में चिंता करने की ज़रूरत नहीं है? मुझे नहीं लगता कि Json.NET में अधिकतम लंबाई निर्धारित करने का एक तरीका है, इसलिए मुझे उम्मीद है कि यह सिर्फ बॉक्स से बाहर काम करेगा।
किंबौड़ी 20

1
बहुत बढ़िया जवाब धन्यवाद! यह तब भी काम आया जब मैं एक वस्तु को लोड करने का प्रयास कर रहा था।
user1299379


2

ऐसा प्रतीत होता है कि कोई "असीमित" मूल्य नहीं है। डिफ़ॉल्ट 2097152 वर्ण है, जो यूनिकोड स्ट्रिंग डेटा के 4 एमबी के बराबर है।

जैसा कि पहले ही देखा गया है, 17,000 रिकॉर्ड ब्राउज़र में अच्छी तरह से उपयोग करने के लिए कठिन हैं। यदि आप एक समग्र दृश्य प्रस्तुत कर रहे हैं तो सर्वर पर एकत्रीकरण करना और ब्राउज़र में केवल एक सारांश हस्तांतरण करना बहुत अधिक कुशल हो सकता है। उदाहरण के लिए, एक फ़ाइल सिस्टम ब्रोकर पर विचार करें, हम केवल पेड़ के शीर्ष को देखते हैं, फिर आगे अनुरोधों का उत्सर्जन करते हैं क्योंकि हम नीचे ड्रिल करते हैं। प्रत्येक अनुरोध में दिए गए रिकॉर्ड की संख्या तुलनात्मक रूप से छोटी है। एक ट्री व्यू प्रस्तुति बड़े परिणाम सेट के लिए अच्छी तरह से काम कर सकती है।


3
बल्कि विचित्र रूप से कोड में डिफ़ॉल्ट (नया JavaScriptSerializer ())। MaxJsonLength 2097152 बाइट्स है, लेकिन वेब सेवा ResponseFormatJson 102400 बाइट्स है जब तक कि स्पष्ट रूप से सेट नहीं किया गया है।
लूटने

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);

यह बहुत सरल है। फिर, इसके बजाय जावास्क्रिप्ट में:

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 कंट्रोलर में मुझे नामस्थान से 'करंट' हटाना था। मैंने एक युगल समायोजन किया: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

2

वैकल्पिक ASP.NET MVC 5 फिक्स:

(मेरा कुछ छोटे बदलावों के साथ उपरोक्त MFCs जवाब के समान है)

मैं अभी तक Json.NET में बदलने के लिए तैयार नहीं था और मेरे मामले में अनुरोध के दौरान त्रुटि हो रही थी। मेरे परिदृश्य में सर्वश्रेष्ठ दृष्टिकोण वास्तविक को संशोधित कर रहा था JsonValueProviderFactoryजो वैश्विक परियोजना पर लागू होता है और global.csइस तरह फ़ाइल को संपादित करके किया जा सकता है ।

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

web.config प्रविष्टि जोड़ें:

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

और फिर निम्नलिखित दो कक्षाएं बनाएं

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 एपसेटिंग मूल्य के अतिरिक्त के साथ 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
धन्यवाद यह काम कर रहा है ... बहुत बहुत धन्यवाद @ माक्सिम गेर्शकोविच
जैस्पर मणिकराज

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 स्रोत कोड के आधार पर स्पष्टीकरण: आप जाँच सकते हैं कि Controller.JsonASP.NET MVC स्रोत कोड में क्या विधि है

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 }। आप दूसरे फ़ॉर्म का उपयोग कर सकते हैं और पैरामीटर बना सकते हैं JsonResult

तो क्या होता है जब आप MaxJsonLengthसंपत्ति सेट करते हैं (डिफ़ॉल्ट रूप से यह शून्य है)? यह संपत्ति के लिए नीचे पारित किया 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));

और जब आप MaxJsonLenghtserializer की संपत्ति सेट नहीं करते हैं तो यह डिफ़ॉल्ट मान लेता है जो कि सिर्फ 2MB है।


-2

अगर यह maxJsonLength मान एक int है तो इसका int 32bit / 64bit / 16bit कितना बड़ा है .... मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि अधिकतम मूल्य जो मैं अपने maxJsonLength के रूप में सेट कर सकता हूं

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

-4

आपको web.config के साथ करने की आवश्यकता नहीं है आप पासिंग लिस्ट के कैच वैल्यू के दौरान छोटी संपत्ति का उपयोग कर सकते हैं। उदाहरण के लिए एक मॉडल घोषित करें

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 = पुस्तक संस्करण और इतने पर जैसे छोटे अनुपात का उपयोग करता हूं


यह मदद नहीं करेगा यदि डेटा का थोक संपत्ति मानों में है
विंडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.