maxJsonLength属性引用什么?

时间:2015-11-13 16:46:46

标签: json jqgrid

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

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

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

我看过jqGrid返回更多数据的例子。感谢您的任何见解。

更新

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

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

using Newtonsoft.Json;

public partial class 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进行序列化或反序列化期间,我仍然会收到错误=&#34;错误。字符串的长度超过maxJsonLength属性上设置的值。&#34;

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

1 个答案:

答案 0 :(得分:2)

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

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

换句话说,如果返回数据的大小可能大约为100k,则每次MaxJsonLength都必须使用JavaScriptSerializer web.config次设置。

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

我不想写太多太常见的东西,但我建议你放弃使用Web服务的reto风格,转到其他界面,这样可以更灵活地选择JSON序列化程序。如果您支持一些旧代码并且无法使用更现代的技术,那么我建议您使用ASHX句柄,这些句柄非常陈旧,但作为WebServices更灵活。我建议您查看the old answer,其中我附加Visual Studio Project,其中使用了ASHX句柄并使用Newtonsoft.JsonJson.NET)返回JSON数据。您可以将Newtonsoft.Json替换为您更喜欢的任何其他JSON序列化程序类。