20080403 Microsoft.Web.Preview 中 Maximum length exceeded 问题的解决

最近在项目里使用了 Microsoft.Web.Preview.dll 中的客户端脚本技术,具体来说是 DataTableConverter,一个服务端DataTable到客户端 DataTable 的序列化传递技术。测试版上没有任何问题,正式版上就出现了 PageMethods 调用页面静态方法失败的问题。调试跟入,发现逻辑层的方法是正常返回 DataTable 的。但一转到页面层,就直接跳入onGetFailed里了。

源代码之前无秘密,从页面静态方法返回到页面脚本执行之间又发生了什么呢?我们从源代码无从知晓。这种不能通过 trace 源代码得到错误根源的状况让人恼火。

静心分析,PageMethods直接调用页面静态方法的方式其实是 ASP.NET AJAX 框架为我们在页面生成了相应的 Web Service 调用代码。而测试版和正式版的差别在什么地方呢?

是数据库!而检查数据库,发现数据是一致的。唯一的差别在于正式版上数据比测试版上多。而在编写 onGetFailed 的脚本方法里没有将 Exception 信息显示出来给用户。打开Exception,发现Message是Maximum length exceeded。马上明白了,是 Web Service 传递的数据量超过了默认设置。

寻找这个选项,在Web.Config里,<jsonSerialization>标签里加上maxJsonLength="10240000"属性。刷新页面,一切正常了。最终为:

<webServices>
  <jsonSerialization maxJsonLength="10240000">
    <converters>
      <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview, Version=1.3.61025.0, Cultrue=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview, Version=1.3.61025.0, Cultrue=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview, Version=1.3.61025.0, Cultrue=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </converters>
  </jsonSerialization>
</webServices>

另外,如果页面向服务器发送数据,则个限制在<httpRuntime />里配置,具体请查询帮助文档。

总结,源码之前,没有秘密,当遇到编程问题无法解决时,则静心调试;当调试到没有源代码时,则静心思考根源,还是一样,有秘密,只是因为没有那部分源码。

计算机真是头逻辑的动物。

 

原文地址:https://www.cnblogs.com/likun/p/1136699.html