"JSON के अनुरोध को निर्विवाद होने के लिए बहुत बड़ा था"


203

मुझे यह त्रुटि मिल रही है:

JSON अनुरोध को बहुत बड़ा किया जा सकता था।

यहाँ एक परिदृश्य है जहाँ यह होता है। मेरे पास देश का एक वर्ग है जो उस देश के शिपिंग पोर्ट की एक सूची रखता है

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Port> Ports { get; set; }
}

मैं ग्राहक की ओर से नॉचआउट जेएस का उपयोग करता हूं ताकि कैस्केडिंग ड्रॉप डाउन हो सके। इसलिए हमारे पास दो ड्रॉप डाउन की एक सरणी है, जहां पहला देश है, और दूसरा उस देश का बंदरगाह है।

अब तक सब कुछ ठीक चल रहा है, यह मेरा क्लाइंट साइड स्क्रिप्ट है:

var k1 = k1 || {};
$(document).ready(function () {

    k1.MarketInfoItem = function (removeable) {
        var self = this;
        self.CountryOfLoadingId = ko.observable();
        self.PortOfLoadingId = ko.observable();
        self.CountryOfDestinationId = ko.observable();
        self.PortOfDestinationId = ko.observable();  
    };

    k1.viewModel = function () {
        var marketInfoItems = ko.observableArray([]),
            countries = ko.observableArray([]),

            saveMarketInfo = function () {
                var jsonData = ko.toJSON(marketInfoItems);
                $.ajax({
                    url: 'SaveMarketInfos',
                    type: "POST",
                    data: jsonData,
                    datatype: "json",
                    contentType: "application/json charset=utf-8",
                    success: function (data) {
                        if (data) {
                            window.location.href = "Fin";
                        } else {
                            alert("Can not save your market information now!");
                        }

                    },
                    error: function (data) { alert("Can not save your contacts now!"); }
                });
            },

            loadData = function () {
                $.getJSON('../api/ListService/GetCountriesWithPorts', function (data) {
                    countries(data);
                });
            };
        return {
            MarketInfoItems: marketInfoItems,
            Countries: countries,
            LoadData: loadData,
            SaveMarketInfo: saveMarketInfo,
        };
    } (); 

समस्या तब होती है जब चीन जैसा देश चुना जाता है, जिसमें बहुत सारे बंदरगाह होते हैं। इसलिए यदि आपके सरणी में आपके पास 3 या 4 बार "चीन" है और मैं इसे सहेजने के लिए सर्वर पर भेजना चाहता हूं। त्रुटि तब होती है।

इसका उपाय करने के लिए मुझे क्या करना चाहिए?


4
किसी के लिए यह उत्सुक है कि ऐसा क्यों होता है या उनके ग्राहक धारावाहिक लिखने - JsonValueProviderFactory.cs के स्रोत कोड पर एक नज़र डालें - ऐसा लगता है जैसे ASP.NET MVC टीम जानबूझकर 1000 पर सीमा
लगाती है

जवाबों:


401

आपको समस्या को हल करने के लिए अधिकतम मान को अधिकतम मूल्य में समायोजित करना होगा web.config

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

aspnet:MaxJsonDeserializerMembersAppSettings में एक उच्च मूल्य सेट करें :

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

यदि वे विकल्प काम नहीं कर रहे हैं तो आप इस धागे में निर्दिष्ट JSON.NET का उपयोग करके एक कस्टम json मूल्य प्रदाता कारखाना बनाने का प्रयास कर सकते हैं ।


57
मैं एक MVC4 एप्लिकेशन पर काम कर रहा था, जो एक कंट्रोलर को json ऑब्जेक्ट्स की बड़ी मात्रा (1k +) को क्रमबद्ध कर रहा था। System.web.extensions विधि ने कुछ भी नहीं किया, लेकिन ऐपसेटिंग मैजिक फिक्स था। धन्यवाद!
TNCodeMonkey 20

4
aspnet:MaxJsonDeserializerMembersमेरे लिए भी काम किया। क्या किसी को पता है कि यह वास्तव में दस्तावेज कहां है?
मैट बर्लेंड

1
MSDN लिंक टूट गया है। सही लिंक है msdn.microsoft.com/en-us/library/...
Ido Ran

14
इसने मेरे लिए काम किया है, लेकिन अभी यह पता चला है: support.microsoft.com/kb/2661403 ... डिफ़ॉल्ट सेटिंग के ऊपर इस मान को बढ़ाने से आपके सर्वर की डेनसिएलिटी ऑफ़ सर्विस भेद्यता के लिए संवेदनशीलता बढ़ जाती है जो सुरक्षा बुलेटिन MS11 में चर्चा की जाती है- 100।
हीरो

4
Aspnet का डिफ़ॉल्ट मान: MaxJsonDeserializerMembers 1000 लगता है: msdn.microsoft.com/en-us/library/hh975440.aspx
23

2

यदि आप वेब कॉन्फ़िगरेशन में एक वैश्विक सेटिंग बदलना नहीं चाहते हैं

एक वैश्विक सेटिंग का उपयोग आपके पूरे आवेदन में बड़े जोंसन प्रतिक्रियाओं को सक्रिय करेगा जो आपको सेवा हमले से इनकार कर सकता है।

यदि कुछ पसंद स्थानों को इसकी अनुमति दी जाती है, तो आप सामग्री विधि का उपयोग करके बहुत जल्दी किसी अन्य जसन धारावाहिक का उपयोग कर सकते हैं:

using Newtonsoft.Json;

// ...

public ActionResult BigOldJsonResponse() 
{
    var response = ServiceWhichProducesLargeObject();
    return Content(JsonConvert.SerializeObject(response));
}
// ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.