当我在ajax调用中返回json太多行时,为什么会出现Http错误500?

时间:2015-12-29 09:40:13

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-mvc-5.2 asp.net-mvc-5.1

这是我的代码:

    var context = _contextFactory.Create(GetClient());
            var r = from p in context.MyTable.ToList()
                    select p;
            int tot;
            var firstPageData = PagedResult(r, 0, 200000, rows => new { rows.Id }, true, out tot);
            return Json(new { result = "ok", rows = firstPageData }, JsonRequestBehavior.AllowGet);

PagedResult()(0和200000)的第一个和第二个参数是页面编号和要返回的行数。这是返回http错误500。

但是当我将第二个参数更改为PagedResult()以仅返回20行时,它工作正常。像这样:

    var context = _contextFactory.Create(GetClient());
            var r = from p in context.MyTable.ToList()
                    select p;
            int tot;
            var firstPageData = PagedResult(r, 0, 20, rows => new { rows.Id }, true, out tot);
            return Json(new { result = "ok", rows = firstPageData }, JsonRequestBehavior.AllowGet);

我是否收到此错误,因为我返回了太多http无法处理的行?或者我需要进行配置,以便返回这么多行吗?

谢谢,

1 个答案:

答案 0 :(得分:2)

为ASP.Net MVC使用自定义JsonResult类,以避免MaxJsonLength超出异常。

public class LargeJsonResult : JsonResult
    {
        const string JsonRequest_GetNotAllowed = "This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.";
        public LargeJsonResult()
        {
            MaxJsonLength = 1024000;
            RecursionLimit = 100;
        }

        public int MaxJsonLength { get; set; }
        public int RecursionLimit { get; set; }

        public override void ExecuteResult( ControllerContext context )
        {
            if( context == null )
            {
                throw new ArgumentNullException( "context" );
            }
            if( JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
                String.Equals( context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase ) )
            {
                throw new InvalidOperationException( JsonRequest_GetNotAllowed );
            }

            HttpResponseBase response = context.HttpContext.Response;

            if( !String.IsNullOrEmpty( ContentType ) )
            {
                response.ContentType = ContentType;
            }
            else
            {
                response.ContentType = "application/json";
            }
            if( ContentEncoding != null )
            {
                response.ContentEncoding = ContentEncoding;
            }
            if( Data != null )
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer() { MaxJsonLength = MaxJsonLength, RecursionLimit = RecursionLimit };
                response.Write( serializer.Serialize( Data ) );
            }
        }
    }

并将其用作

return new LargeJsonResult { Data = Your Data, JsonRequestBehavior = `System.Web.Mvc.JsonRequestBehavior.AllowGet };`