在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设置,它可以正常工作。如果我把它留下注释并带回更少的数据,它就可以了。我错过了什么?
答案 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.Json
(Json.NET
的同义词),这不是最快的,但相对较好且功能强大。
我不想写太多太常见的东西,但我建议你放弃使用Web服务的reto风格,转到其他界面,这样可以更灵活地选择JSON序列化程序。如果您支持一些旧代码并且无法使用更现代的技术,那么我建议您使用ASHX句柄,这些句柄非常陈旧,但作为WebServices更灵活。我建议您查看the old answer,其中我附加Visual Studio Project,其中使用了ASHX句柄并使用Newtonsoft.Json
(Json.NET
)返回JSON数据。您可以将Newtonsoft.Json
替换为您更喜欢的任何其他JSON序列化程序类。