为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScriptSerializer期间ASP.NET MVC中的MaxJsonLength异常

JavaScriptSerializer期间ASP.NET MVC中的MaxJsonLength异常

蛊毒传说 2019-10-25 11:00:54
在我的控制器操作之一中,我将返回一个很大的值JsonResult以填充网格。我收到以下InvalidOperationException异常:使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过了在maxJsonLength属性上设置的值。不幸的是,将中的maxJsonLength属性设置web.config为较高的值不会显示任何效果。<system.web.extensions>  <scripting>    <webServices>      <jsonSerialization maxJsonLength="2147483644"/>    </webServices>  </scripting></system.web.extensions>我不想像这个答案中提到的那样将其作为字符串传递回来。在我的研究中,我遇到了这篇博客文章,建议您编写自己的文章ActionResult(例如LargeJsonResult : JsonResult)以绕过此行为。这是唯一的解决方案吗?这是ASP.NET MVC中的错误吗?我想念什么吗?非常感激任何的帮助。
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

看来这已在MVC4中修复。


您可以这样做,对我来说效果很好:


public ActionResult SomeControllerAction()

{

  var jsonResult = Json(veryLargeCollection, JsonRequestBehavior.AllowGet);

  jsonResult.MaxJsonLength = int.MaxValue;

  return jsonResult;

}


查看完整回答
反对 回复 2019-10-25
?
噜噜哒

TA贡献1784条经验 获得超7个赞

您也可以ContentResult按照此处的建议使用,而不是子类化JsonResult。


var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue, RecursionLimit = 100 };


return new ContentResult()

{

    Content = serializer.Serialize(data),

    ContentType = "application/json",

};


查看完整回答
反对 回复 2019-10-25
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我通过以下 链接解决了这个问题


namespace System.Web.Mvc

{

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

    }

}


}


protected void Application_Start()

    {

        AreaRegistration.RegisterAllAreas();


        RegisterGlobalFilters(GlobalFilters.Filters);

        RegisterRoutes(RouteTable.Routes);


        //Remove and JsonValueProviderFactory and add JsonDotNetValueProviderFactory

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

        ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());

    }


查看完整回答
反对 回复 2019-10-25
  • 3 回答
  • 0 关注
  • 709 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信