【问题标题】:Get large amount of data using ajax使用ajax获取大量数据
【发布时间】:2017-10-01 03:31:54
【问题描述】:

我有以下ajax 代码用于从服务器获取用户详细信息。我正在从服务器端生成html table 并将结构作为字符串返回。这工作正常,但当用户记录太多时我得到undefined。可以在 ajax 中传递的数据有什么限制? 有没有一种替代方法可以用来在客户端生成 html 表?

 var param = {};
    param.CompanyID = $('[id*=txtCoID]').val();
    $.ajax({
        type: 'POST',
        url: 'AjaxAsync.aspx/BindActiveUsers',
        beforeSend: function () { },
        data: '{P: ' + JSON.stringify(param) + '}',
        contentType: 'application/json; charset=utf-8',
        //processData: false,
        //timeout: 1000000,
        //async: true,
        //cache: false,
        dataType: 'json',
        success: function (rsp) {
            document.getElementById('dvUsers').innerHTML = rsp.d;
        },
        error: function (error) {
            document.getElementById('dvUsers').innerHTML = error.d;
        }
    });    

【问题讨论】:

  • 究竟哪个变量显示为未定义?例如,我知道一个事实,如果您的代码出于任何原因进入“错误”回调,则 error.d 不存在 - 检查 jQuery ajax 文档以了解该对象中实际存在哪些字段。如果您正在进入“错误”回调,服务器返回的错误是什么(您可以在浏览器的网络选项卡中的开发人员工具中看到它)?而且,究竟有多少条记录是“太多”?你是如何确定的?
  • @ADyson undefined 处于“错误”中,但是当我向服务器返回的记录添加限制时,代码运行无错误
  • 这是我得到的错误500 - undefined
  • 我只按照下面回答中的建议更改了配置文件,我曾经收到错误 500 因为超时,我正在使用 aspx 项目
  • 浏览器控制台中没有错误,建议在我限制服务器返回的记录时触发请求,我的代码运行良好,正在生成一个大约 3000 行的 html 表。

标签: javascript jquery ajax


【解决方案1】:

HTTP 没有规定最大数据大小。您面临的限制是由您的网络服务器强加的,因此您需要提高上限。

另一种解决方案可能是部分构建 HTML 表并创建一个按钮,按下该按钮可加载其余部分(或使用 EventListener 捕获页面滚动位置并在用户滚动时继续加载)。如果这种方法满足您的要求,您应该不会面临任何类型的数据限制。

【讨论】:

  • 谈到部分构建 html 表,我将如何将内容附加到已经加载的数据以最终得到一个表?
  • 赞成这个解决方案,因为它减轻了服务器的负载,并提供了对少量数据的更快访问,假设它仅限于您的要求。请参阅有关附加行的问题stackoverflow.com/questions/171027/add-table-row-in-jquery
【解决方案2】:

根据this questionthis question,AJAX 请求中传输的数据量没有限制。浏览器或您的服务器可能会施加限制。您是否使用多个浏览器测试过您的应用程序?哪种类型的服务器?您能尝试找出请求失败的大致数据量吗?

This question 表明应该有配置值以允许大规模传输。一个答案建议将您的数据转换为 JSON 字符串,您已经完成了。

关于生成表的另一种方法,我最初的想法是将请求分解为多个请求(可能基于用户记录的数量)。如果您无法解决问题,也许您可​​以使用此方法。 @Arnau Fernández 的建议在用户滚动时以小块加载数据是相似且聪明的。如果您不希望滚动和加载行为,您可以一次发送所有请求,这样仍然可以安全地消除使用较小请求的大量请求。

我在您的网址中看到了.aspx。如果您使用的是 asp.net,则可以尝试使用 solution here,它会调整 web.config 文件中的值。如果这没有帮助,那么有关您的技术的更多信息会有所帮助。

粘贴他们的配置以供参考:

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

【讨论】:

  • 让我试试这个选项,看看它是否适合我。
【解决方案3】:

问题是由于请求超时而不是数据大小引起的。因为我在 aspx 项目中使用了 ajax updatepanel,所以我将 AsyncPostBackTimeOut='300000000' 添加到我的 ToolkitScriptManager 标签并添加

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

到我的Web.config 文件,如记录的here。现在我可以毫无问题地加载数据,尽管这需要一些时间,具体取决于返回的记录数。感谢您的帮助。

【讨论】:

    【解决方案4】:
            JavaScriptSerializer js = new JavaScriptSerializer();
            js.MaxJsonLength = Int32.MaxValue;
            string str = js.Serialize(YourList);
    

    当json字符串大小很大时,它无法将数据发送到客户端,所以你必须像“Int32.MaxValue”一样增加大小。无需配置 web.config 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2016-01-15
      • 2020-07-05
      相关资源
      最近更新 更多