2012-03-01 14 views
28

मुझे अपवाद मिल रहा है कि JSON अनुरोध deserialized होने के लिए बहुत बड़ा था।JsonValueProviderFactory फेंकता है "बहुत बड़ा अनुरोध"

यह JsonValueProviderFactory से आ रहा है ....

MVC App वर्तमान Json.Net जो json डेटा deserializing कोई समस्या नहीं है का उपयोग कर एक कस्टम मॉडल बांधने की मशीन है। हालांकि मुझे लगता है कि डिफ़ॉल्ट JSON मान प्रदाता ट्रिपिंग कर रहा है? या इसमें कुछ अजीब सीमा है?

यह जब पिछले निर्माण MVC4 की वहाँ JSON की बड़ी मात्रा के साथ कोई समस्या नहीं थे का उपयोग कर के रूप में MVC4 की नवीनतम रिलीज के साथ क्या करना होना हो सकता है।

इसलिए, वास्तविक json मूल्य बांधने की मशीन की स्थापना रों बदलने के लिए एक तरीका है?

धारणा यह है कि यह एक शब्दकोश में बदल जाता है कुछ कस्टम बात है द्वारा http://haacked.com/archive/2011/06/30/whatrsquos-the-difference-between-a-value-provider-and-model-binder.aspx

जा रहा मैं हो .... मैं इसे करने के लिए या मैं बदल सकते हैं अगर कोई सेटिंग नहीं है जुड़े किसी स्रोत कोड नहीं मिल सकता है?

या क्या कोई वैकल्पिक वैल्यूबिन्डर मैं उपयोग कर सकता हूं?

या कोई अन्य विकल्प?

public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     if (controllerContext == null) 
      throw new ArgumentNullException("controllerContext"); 

     if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
      return null; 

     var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream); 
     var bodyText = reader.ReadToEnd(); 

     return String.IsNullOrEmpty(bodyText) ? null : new DictionaryValueProvider<object>(JsonConvert.DeserializeObject<ExpandoObject>(bodyText, new ExpandoObjectConverter()) , CultureInfo.CurrentCulture); 
    } 
} 

और अपने Application_Start में:

Server Error in '/' Application. 
The JSON request was too large to be deserialized. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The JSON request was too large to be deserialized. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 

[InvalidOperationException: The JSON request was too large to be deserialized.] 
    System.Web.Mvc.EntryLimitedDictionary.Add(String key, Object value) +464621 
    System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +413 
    System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +164 
    System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +164 
    System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +373 
    System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +164 
    System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext) +116 
    System.Web.Mvc.<>c__DisplayClassc.<GetValueProvider>b__7(ValueProviderFactory factory) +34 

     System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +177 

उत्तर

64

आप क्रमांकन/deserialization के लिए JSON.NET का उपयोग करते हैं, आप एक कस्टम एक के रूप में this blog post में दिखाया गया है के साथ डिफ़ॉल्ट JsonValueProviderFactory स्थानापन्न सकता

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); 
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); 

और यदि आप डिफ़ॉल्ट कारखाने के साथ चिपकना चाहते हैं जो JavaScriptSerializer कक्षा का उपयोग करता है तो आपसमायोजित कर सकते हैं अपने web.config मेंसंपत्ति:

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

और उदासी आप केवल इस के लिए प्रतिष्ठा की एक छोटी राशि, प्राप्त जहां कोई है जो उत्तर देता है सी # में एक stirng विभाजित करने के लिए कैसे मिल जाएगा बाल्टी भार :) धन्यवाद! वास्तव में उपयोगी था ..... दिलचस्प रूप से पर्याप्त maxJsonLength बड़ा काम नहीं किया था। मुझे लगता है कि डिफ़ॉल्ट जेसन वैल्यू बाइंडर –

+0

में कोई गलती हो सकती है क्योंकि मेरा कस्टम मॉडल बाइंडर सबकुछ संभाला जा रहा है, इसलिए मैंने केवल हटा दिया है। मैं सब कुछ deserializing डबल नहीं बनना चाहता! –

+0

क्या होगा यदि मैं 'स्ट्रिंग' भेजता हूं और JSON.NET के साथ इसे deserialize? यदि स्ट्रिंग बहुत बड़ी है तो क्या मुझे कभी भी त्रुटि मिलेगी? –

61

मेरे लिए, maxJsonLength पार नहीं किया जा रहा था।

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

ऐसा नहीं है कि एक के बाद इलाज में काम किया: मैं निम्नलिखित जोड़ने के लिए किया था।

+3

के बजाय एमवीसी 4 का उपयोग कर रहा हूं ..... मैं उम्र बढ़ने में व्यतीत कर रहा हूं serialization के लिए कहीं भी नए हैंडलर लिखना, जब यह सब के साथ था ..... धन्यवाद ... –

+2

मुझे भी, यह मुद्दा था। –

+1

महान उत्तर !!! यह मेरी मदद की!बहुत धन्यवाद! – Bronek

3

उपरोक्त सुझावों मेरे लिए काम नहीं किया जब तक मैं इस कोशिश की:

// Global.asax.cs  
protected void Application_Start() { 
    MiniProfiler.Settings.MaxJsonResponseSize = int.MaxValue; 
} 
संबंधित मुद्दे