【问题标题】:How do I resolve an exception for exceeding maxJsonLength in JavaScriptSerializer?如何解决 JavaScriptSerializer 中超出 maxJsonLength 的异常?
【发布时间】:2014-12-12 11:54:04
【问题描述】:

我找到了一些在大型响应的上下文中解决此问题的答案,但在我的大型请求上下文中没有找到。将大文件发布到操作方法时出现以下异常:

使用 JSON 进行序列化或反序列化时出错 JavaScript 序列化器。字符串长度超过设置的值 在 maxJsonLength 属性上。

这是在我的操作方法被击中之前,所以大量的帖子告诉我在我的响应中设置更高的 json 大小在这里都是无用的。

堆栈跟踪是:

at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
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)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state)
at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state)
at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

【问题讨论】:

  • 发生这种情况时的堆栈跟踪是什么?
  • @RobertLevy 为后代添加,但我找到了解决方案。

标签: asp.net-mvc json asp.net-mvc-4 javascriptserializer


【解决方案1】:

广泛而恐慌的谷歌搜索让另一个可怜的开发者遇到了这个问题,答案很简单,但令人失望的是侵入性:

First you must build a custom JsonValueProviderFactory.

我从他的回答中逐字复制了 dkinchen 的自定义代码,它立即生效。

我知道这是一个链接答案,但我认为链接的文字本身就是一个很好的答案。

【讨论】:

    【解决方案2】:

    根据您当前的环境,有三种基本的处理方法:

    1. 在 web.config 中设置 MaxJsonLength 属性默认值。 (这仅适用于处理 JSON 的网络服务)
    2. 设置JavascriptSerializer 对象的MaxJsonLength 属性以执行序列化。
    3. 如果您使用MVC4 处理返回您的JSON 值,您可能需要覆盖默认JsonResult() ActionResult 并手动更改最大大小。

    有关如何实施这三个解决方案的来源和更多信息:http://rionscode.wordpress.com/2013/04/28/handling-larger-json-string-values-in-net-and-avoiding-exceptions/

    【讨论】:

    • 添加后没有区别。
    • 我根本没有进行任何序列化或返回任何值。我在发布到操作时收到错误,甚至在操作代码被命中之前。
    • 序列化是由 MVC 引擎在你的 Action 被击中之前完成的。您可以从异常中注意到,System.Web.Script.Serialization.JavaScriptSerializer.Deserialize.
    • 我想到了类似的东西,但在我找到答案之前,我对如何拦截或配置反序列化一无所知。
    【解决方案3】:

    您可以通过在 Web.config 或 Controller 或两者中指定键来解决此问题。方法如下:

    1.) 在 Web.config 中,方法 1:

    &lt;add key="aspnet:MaxJsonDeserializerMembers" value="214748364" /&gt;

    2.) 在 Web.config 中,方法 2:

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

    3.) 在控制器中返回 JSON 数据:

      var result = Json("Data", JsonRequestBehavior.AllowGet);
                result.MaxJsonLength = Int32.MaxValue;
                return result;
    

    【讨论】:

    • system.web.extensions 仅适用于 Web 服务,不适用于控制器操作。
    • 是吗?我想我可以将它用于任何 JavaScriptSerializer 类。我什至在 msdn 中搜索了相同的内容:msdn.microsoft.com/en-us/library/…
    • 你能告诉我在哪里可以找到相同的参考吗?
    • 此外,我的答案的第一种和第三种方法总是有效,而不是将整个长代码复制到其中。我自己试过了。
    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多