2014-11-06 26 views
6

我做阿贾克斯后,从在mvc4的JavaScript发布的数据,但它不能与下面的异常在与庞大的数据系统mvc4阿贾克斯后抛出System.ArgumentException异常

string exceeds the value set on the maxJsonLength property. 
Parameter name: input 
System.ArgumentException: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property. 

我已经尝试设置在网络配置配置,但它不工作

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

我也尝试下面的链接,但没有任何工程: http://forums.asp.net/t/1751116.aspx?How+to+increase+maxJsonLength+for+JSON+POST+in+MVC3

var editorText = eval(htmlEditor).GetHtml();  
$.ajax({type: 'POST', 
    cache: false, 
    contentType: 'application/json; charset=utf-8', 
    url: "../Home/SaveExceptionLetter", 
    data: JSON.stringify({ message: editorText }), 
    datatype: 'json', 
    success: function() { 
    }); 
} }); 

[HttpPost] 
[ValidateInput(false)] 
public void SaveExceptionLetter(string message){ 
    //processing this message 
} 

string exceeds the value set on the maxJsonLength property. 
Parameter name: input 
System.ArgumentException: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property. 
Parameter name: input 
    at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) 
    at System.Web.Mvc.JsonValueProviderFactory.GetDeserializedObject(ControllerContext controllerContext) 
    at System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext) 
    at System.Web.Mvc.ValueProviderFactoryCollection.<>c__DisplayClassc.<GetValueProvider>b__7(ValueProviderFactory factory) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext) 
    at System.Web.Mvc.ControllerBase.get_ValueProvider() 
    at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) 
    at System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) 
+0

web配置设置为 usFarswan 2014-11-06 07:23:20

+0

看看 http://stackoverflow.com/questions/1151987/can-i-set-an-unlimited-length-for-max-sonlength-in-web-config?rq=1 – 2014-11-06 07:39:39

回答

0

有一个web.config中另一个设置,你可以试着加大:

<system.web> 
    // the default request size is 4096 KB (4 MB) this will increase it to 100 MB 
    <httpRuntime targetFramework="4.5" maxRequestLength="102400" /> 
<system.web> 
+0

我已经完成此请求长度设置但它不起作用 – usFarswan 2014-11-06 07:35:22

+0

@usFarswan你能发表一些代码吗? – 2014-11-06 07:38:52

+0

我编辑了现有的问题,请在上面找到详细信息 – usFarswan 2014-11-06 07:50:16

13

嗨@usFarswan这正是我碰到短短半小时前开始,解决的办法是http://forums.asp.net/t/1751116.aspx?How+to+increase+maxJsonLength+for+JSON+POST+in+MVC3

你可以像这样实现它,在global.asax中添加/// *****指出的以下行。我已经施加

namespace MyWebApp 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 


      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      XmlConfigurator.Configure(); 
      DbHelper.getSessionFactory(); 

      ///// ********** 
      JsonValueProviderFactory jsonValueProviderFactory = null; 

      foreach (var factory in ValueProviderFactories.Factories) 
      { 
       if (factory is JsonValueProviderFactory) 
       { 
        jsonValueProviderFactory = factory as JsonValueProviderFactory; 
       } 
      } 

      //remove the default JsonVAlueProviderFactory 
      if (jsonValueProviderFactory != null) ValueProviderFactories.Factories.Remove(jsonValueProviderFactory); 

      //add the custom one 
      ValueProviderFactories.Factories.Add(new CustomJsonValueProviderFactory());** 
     /////************* 
     } 
    } 




    ///******** 
    public sealed class CustomJsonValueProviderFactory : ValueProviderFactory 
    { 

     private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value) 
     { 
      IDictionary<string, object> d = value as IDictionary<string, object>; 
      if (d != null) 
      { 
       foreach (KeyValuePair<string, object> entry in d) 
       { 
        AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value); 
       } 
       return; 
      } 

      IList l = value as IList; 
      if (l != null) 
      { 
       for (int i = 0; i < l.Count; i++) 
       { 
        AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]); 
       } 
       return; 
      } 

      // primitive 
      backingStore[prefix] = value; 
     } 

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

      StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream); 
      string bodyText = reader.ReadToEnd(); 
      if (String.IsNullOrEmpty(bodyText)) 
      { 
       // no JSON data 
       return null; 
      } 

      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      serializer.MaxJsonLength = int.MaxValue; //increase MaxJsonLength. This could be read in from the web.config if you prefer 
      object jsonData = serializer.DeserializeObject(bodyText); 
      return jsonData; 
     } 

     public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
     { 
      if (controllerContext == null) 
      { 
       throw new ArgumentNullException("controllerContext"); 
      } 

      object jsonData = GetDeserializedObject(controllerContext); 
      if (jsonData == null) 
      { 
       return null; 
      } 

      Dictionary<string, object> backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 
      AddToBackingStore(backingStore, String.Empty, jsonData); 
      return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture); 
     } 

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

     private static string MakePropertyKey(string prefix, string propertyName) 
     { 
      return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName; 
     } 
    } 
    ///************* 
} 
+2

这是网络上为我工作的唯一解决方案。谢谢! :)下面是替换值提供程序工厂的较短代码:http://stackoverflow.com/a/14591946/2173353 +1 – user2173353 2015-06-17 10:23:27

+0

伟大的soution,谢谢! – 2016-11-02 07:17:01