【问题标题】:What does the maxJsonLength property refer to?maxJsonLength 属性指的是什么?
【发布时间】:2015-11-13 16:46:46
【问题描述】:

在 Web 表单项目中,我正在使用 SQL 存储过程加载 jqGrid,其中我将数据作为 json 返回。在初始设置和测试期间,我返回了 85 行数据。然后我更改了导致返回 1,868 行的参数,但它没有显示在网格中。

在 Firebug 中调试时,我看到错误“字符串的长度超过了 maxJsonLength 属性上设置的值”。我通过在我的 webconfig 中设置 maxJsonLength="2147483647" 来修复它,如流行的 Stackovrflow 帖子中所示。

所以我的问题是导致错误的字符串是什么?是整个数据记录的长度,还是返回的其中一列的数据长度?

我已经看到 jqGrid 返回更多数据的示例。感谢您提供任何见解。

更新

我听取了 Olegs 的建议,并使用 Nuget 在我的项目中安装了 Newtonsoft.Json。然后我对我的代码进行了更改以使用它:

在代码隐藏 - .cs 我有这个:

using Newtonsoft.Json;

公共部分类 Default2 : System.Web.UI.Page {

[WebMethod]
public static string GetDataFromDB()

{
    DataSet ds = new DataSet();


    string con = System.Configuration.ConfigurationManager.ConnectionStrings["SQLCon"].ToString();
    SqlConnection SCon = new SqlConnection(con);
    SCon.Open();
    SqlCommand sqlCmd = new SqlCommand("dbo.usp_GetProjectDetails", SCon);
    sqlCmd.CommandType = CommandType.StoredProcedure;

    sqlCmd.Parameters.Add("@ProjNum", SqlDbType.Int).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@TrakIt", SqlDbType.VarChar, 255).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@Title", SqlDbType.VarChar, 255).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@Status", SqlDbType.VarChar, 255).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@Dept", SqlDbType.Int).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@AssignTo", SqlDbType.Int).Value = DBNull.Value;  //19;
    sqlCmd.Parameters.Add("@RecDate", SqlDbType.DateTime).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@CmpDate", SqlDbType.DateTime).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@ExComp", SqlDbType.Int).Value = DBNull.Value;
    sqlCmd.Parameters.Add("@ExAcReq", SqlDbType.Int).Value = DBNull.Value;

    SqlDataAdapter da = new SqlDataAdapter(sqlCmd);
    da.Fill(ds);
    SCon.Close();

    return JsonConvert.SerializeObject(ds.Tables[0]);
}

.aspx 中的函数如下所示:

    <script type="text/javascript">
    $(document).ready(function () {
        $.ajax({
            type: "POST",
            contentType: "application/json",
            data: "{}",
            url: "Default2.aspx/GetDataFromDB",
            dataType: "json",
            success: function (data) {
                data = data.d;
                $("#list1").jqGrid({
                    datatype: "local",
                        colNames: ["Project #", "Trak-It #", "Priority", "Title", "Status", "Department", "Assigned To", "Resource", "Requestor"],
                        colModel: [
                                          { name: 'Project Number', index: 'Project Number', width: 80, key: true, formatter: 'showlink', formatoptions: { baseLinkUrl: 'Details.aspx', target: '_new' } },
                                          { name: 'Trak-It #', index: 'Trak-It #', width: 80 },
                                          { name: 'Priority', index: 'Priority', width: 80 },
                                          { name: 'Title', index: 'Title', width: 200 },
                                          { name: 'Status', index: 'Status', width: 80 },
                                          { name: 'Department', index: 'Department', width: 180 },
                                          { name: 'Assigned To', index: 'Assigned To', width: 100 },
                                          { name: 'Resource', index: 'Resource', width: 160 },
                                          { name: 'Requestor', index: 'Requestor', width: 140 }
                        ],
                        data: JSON.parse(data),
                        rowNum: 8,
                        rowList: [10, 20, 30],
                        pager: '#pager1',
                        caption: "Test Grid",
                        viewrecords: true,
                        ignoreCase: true,
                        async: true,
                        loadonce: true,
                        gridview: true,
                        width: 1000
                });
            }
        });
    });

</script>

最后在 Web.config 中,我注释掉了 maxjsonLength:

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

但我仍然收到错误 =“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了 maxJsonLength 属性上设置的值。”

如果我取消注释 web.config 设置,它就可以正常工作。如果我将其注释掉并带回更少的数据,它就可以正常工作。我错过了什么?

【问题讨论】:

    标签: json jqgrid


    【解决方案1】:

    您的意思可能是System.Web.Script.Serialization.JavaScriptSerializer.MaxJsonLength 属性,如果您在服务器代码中使用 WebServices 接口,则需要全局增加该属性。例如,the answer 中描述了该解决方案。

    您询问问题的背景信息。说实话,主要问题是在 ASP.NET 应用程序中使用非常老的 WebService 接口。这是微软多年前首次尝试根据 HTTP 请求的 Content-Type 标头返回 XML 或 JSON 数据。它是在 .NET Framework 3.5 中实现的。 Web 服务应返回 object(不是字符串),该对象将由 .NET 框架通过使用 JavaScriptSerializer 序列化为 JSON 字符串。您的代码不直接使用JavaScriptSerializer。因为不直接使用JavaScriptSerializer,所以只能在web.config中配置JavaScriptSerializer的参数。

    也就是说,如果返回数据的大小可能大到 100k 左右,则每次都必须使用 JavaScriptSerializer 中的 JavaScriptSerializerMaxJsonLength 设置。

    在 8 年前(2007 年)发布 .NET Framework 3.5 时,Web 方法的限制 100k 相对较大。后来微软引入了 WCF 接口,使得 JSON 序列化更快,并且限制不小。 WCF 现在也太老了,但它仍然允许手动序列化使用更高性能版本的 JSON 序列化程序(例如,参见 the answer)。在 WCF 之后,微软引入了 ASP.NET MVC,然后是 WebAPI。现在微软在 ASP.NET 5 和 MVC 版本 6 上工作,它们将 MVC 和 WebAPI 结合在一个名称 MVC6 下。从 MVC2(或 MVC3)开始,Microsoft 停止开发自己的 JSON 序列化程序,并建议使用其他的。微软主要使用Newtonsoft.JsonJson.NET的同义词),这不是最快的,但比较好和强大。

    我不想写太多太普通的东西,但我建议你放弃使用 WebServices 的 reto 风格,转而使用其他接口,让你在选择 JSON 序列化程序时更加灵活。如果您支持一些旧代码并且不能使用更现代的技术,那么我建议您使用 ASHX 句柄,它非常古老,但比 WebServices 灵活得多。我建议您查看the old answer,我在其中附加了Visual Studio Project,它使用ASHX 句柄并使用Newtonsoft.Json (Json.NET) 返回JSON 数据。您可以将 Newtonsoft.Json 替换为您更喜欢的任何其他 JSON 序列化程序类。

    【讨论】:

    • Oleg - 感谢您提供的信息,尽管我不确定我是否遵循您的最后一段。我正在使用 Web 表单来利用会员服务,并且需要一个固定的标题类型网格来显示存储过程的结果——因此我使用了 jqGrid。在我对它的研究中,我实际上下载了你的 VS 项目,但我需要做的似乎很多。
    • 另外,这是一个新项目,我刚刚开始用 C# 编写代码。所以我认为答案是返回的 json 数据量有限制,如果结果集很大,我可能会遇到问题。
    • 如果您刚开始使用 C# 编写代码,那么我建议您使用 ASP.NET MVC5 并实现控制器操作,该操作仅返回从 STORED PROCEDURE 返回的所有数据。您应该只添加 loadonce: true jqGrid 选项。然后 jqGrid 将对所有数据本地进行分页/过滤/排序。如果您只是从控制器操作中返回 Json(listOfItems, JsonRequestBehavior.AllowGet),则 MVC5 默认使用 Newtonsoft.Json。因此,您只需从 STORED PROCEDURE 的调用结果中准备 List&lt;items&gt;
    • 我使用了 Nuget 并安装了 Newtonsoft.Json。我的存储过程填充了一个数据表 - dt,因此我通过执行以下操作将其转换为 json 字符串: string json = JsonConvert.SerializeObject(dt);现在我回到了 jqgrid 的绘图板上,试图显示这个。不确定如何在此处显示 cmets 中的代码。感谢 Newtonsoft.Json 的提醒 - 我将从 web.config 中删除最大长度
    • @Brian:不客气! jqGrid 现在会成功填充大数据吗?如果您需要发布一些代码,那么您应该始终执行以下操作:单击问题文本下方的“编辑”链接/按钮,在您的文本中附加诸如 UPDATED:​​> 或 UPDATED 2 之类的词: 然后附加任何代码或附加信息,最后你应该写简短的评论告诉其他人你在问题文本的末尾发布了附加信息。
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多