【问题标题】:is there a timeout when using Jquery/ajax/jasonresult on large data sets?在大型数据集上使用 Jquery/ajax/jasonresult 时是否有超时?
【发布时间】:2011-12-06 22:50:23
【问题描述】:

***更新信息

我现在认为这不是超时问题。但是确实有一些东西会造成服务器错误(“500”)。我已经用各种数据集进行了测试,一旦大小超过某个阈值,就会调用 ajaxError 函数。服务器在数据库中查询数据行并将其转换为 XML 字符串。 db 有一组创建递归构造的 xml 字符串的表。父表有 2300 行,子表有大约 20000 - 所以字符串相当大。但是,如果我使用这样的代码,这个函数可以正常工作:

    <form id="theTax" method="post" action="ProcessTax" >
@{
    TaxonomyHelper th = new TaxonomyHelper(1);
    @Html.Raw(th.TaxonomyDivTag.ToString())        
 }
</form>

因此,在这种情况下,会返回大量数据,并且渲染需要一分钟多的时间(在客户端上递归完成)......它可以工作。我的目标是利用 ajax 并根据用户的需求分而治之(始终是这个完整数据集的重要子集)。我唯一的好奇是为什么当我使用 ajax、jquery 和 json 做同样的事情时,我会得到这个服务器错误吗?更重要的是,在要求数据集大小太大而无法成功之前,我是否应该检查一些限制?

所以在今天的测试中,当我将集合细分到某个较小尺寸的限制时,我没有收到错误。它总是工作或不工作 - 就好像它测量了服务器所说的内容,并在达到该大小限制时说“不”。我尝试过延迟,坐在断点上和其他愚蠢的措施 - 我尝试通过调整 linq2sql 查询以各种形式划分级别 2 xml 节点......无论如何,它总是有效或始终无效。

所以现在的问题是:是否有人知道从服务器调用返回的“getJSON”调用的总数据大小限制?这似乎是真的,因为成功与失败的相对规模似乎非常接近。我需要添加一些代码来测量大小,但如果有人知道这一点,那会更快:)

再次感谢赠品,但我现在确实相信这可能是有价值的,而不是让我学习有关 jquery、ajax 和如何拼写 json 的新知识;)


下面的代码 sn-ps 是 MVC3 应用程序的一部分。 URL(名为“GetJson”的函数)返回的 JasonResult 返回显示在 div 标记中的 html。名为“GetJason”的 JasonResult 函数返回相当少量的字符 - 大约 10K。 “GetJasonAll”是相当多的字符 - 远远超过 100K。它们都是大型分类法的呈现。

我试图找出较小版本的 JasonResult 工作正常而另一个无法显示数据的原因。在使用 jquery ajax 功能时,我尝试了异步、同步和其他一些想法 - 都无济于事。它似乎表现得像超时一样。但我知道该函数正在从 JasonResult 控制器函数返回数据。但它似乎死在那里 - 好像浏览器会在说“继续前进”之前等待很长时间。我已经浏览了 jquery js,但似乎无法找出结果似乎无效的位置。

感谢任何帮助。请注意,如果我使用 ActionResult 并拉下更大的数据集,我对页面没有任何问题。它只需要很长时间,我的策略是分而治之,因为我打开一个递归列表,逐步依赖于用户的输入。显然,我可以在没有 ajax 的情况下往返,但这会不那么吸引人,我希望我在这里遗漏了一些东西。

另外一点可能有帮助的信息:如果我在“processJSON”函数中放置一个“调试器”断点 - 小集显然会命中它,但大集不会。如果存在超时问题,这是有道理的。无论哪种情况,都可以立即单击启动脚本的按钮。即,没有锁定等。

  • 感谢您的任何反馈。

脚本代码:

<script type="text/javascript">
$(document).ready(function () {

    $.ajaxSetup({ 'async': false });
    $('#someButton').click(function () {
        $.get('GetJson', function (data) {
            processJSON(data);
        });
    });

    function processJSON(data) {
        var output = data;
        $('#SomeDiv').html(output);
    }
});

两个 .NET 控制器功能:

        public JsonResult GetJson()
    {            
        JsonResult js = new JsonResult();
        TaxonomyHelper th = new TaxonomyHelper(1);
        js.Data =   "<script src='taxonomyRenderer.js' type='text/javascript'></script>" +
                    "<link href='taxonomyStyle.css' rel='stylesheet' type='text/css' />" +         
        th.TaxonomyDivTag.ToString();
        js.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        return js;
    }

    public JsonResult GetJsonAll()
    {
        JsonResult js = new JsonResult();
        TaxonomyHelper th = new TaxonomyHelper();
        js.Data = "<script src='taxonomyRenderer.js' type='text/javascript'></script>" +
                    "<link href='taxonomyStyle.css' rel='stylesheet' type='text/css' />" +
            th.TaxonomyDivTag.ToString();
        js.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        return js;
    }

【问题讨论】:

  • +1 表示新术语,JasonResult。以前从未听说过。杰森是谁?
  • 好笑。但答案会更有帮助,哈哈。对此的一个补充...我添加了代码以提取大型数据集的子集,它实际上有时有效,但其他无效..并且总是当 JSON :) 结果很大时。因此,似乎确实存在某种超时,或者理想情况下我可以设置一个参数,上面写着“我不在乎多久……我会等”。提前感谢您提供的不仅仅是拼写检查 LOL。

标签: jquery json


【解决方案1】:

没有$.get() 超时。请参阅jQuery source,默认为 0。

您可能会收到错误响应,但除非您将某些内容附加到错误处理程序,否则它会静默失败。请参阅 this post 描述如何连接您的 $.get() 错误处理程序。 jQuery 擅长隐藏错误以方便最终用户 - 不利于开发人员。

如果您知道要返回 JSON,则还应使用 $.getJSON()

【讨论】:

  • 谢谢。错误处理程序没有什么帮助,但确实告诉我这是一个 500 错误。你是正确的“getJSON”。我首先尝试过,但只是出于其他原因四处寻找,代码 sn-p 有“get”。我注意到的是,虽然两者都有效,但 getJSON 更快。
  • @LlewellynPreece - 如果您收到 500 响应,那么 IIS 可能会终止您的请求执行。您可能需要增加httpRuntime/@executionTimeout。见MSDN reference
【解决方案2】:

在 JQuery 中使用低级 ajax 接口而不是简写方法
:- http://api.jquery.com/jQuery.ajax/

超时次数
为请求设置超时(以毫秒为单位)。这将覆盖使用 $.ajaxSetup() 设置的任何全局超时。超时时间从 $.ajax 调用开始;如果其他几个请求正在进行中并且浏览器没有可用的连接,则请求可能会在发送之前超时。在 jQuery 1.4.x 及以下版本中,如果请求超时,XMLHttpRequest 对象将处于无效状态;访问任何对象成员都可能引发异常。仅在 Firefox 3.0+ 中,脚本和 JSONP 请求不能被超时取消;即使在超时期限之后到达,脚本也会运行。

【讨论】:

  • 感谢您的回复。有帮助,但事实并非如此。我可以模拟超时错误。事实上,当出现问题时,ajax 错误处理程序(异常参数)将返回“超时”错误。它不是。但我确实验证了。该错误是虚幻的“500”服务器错误。但我知道服务器中没有错误,因为相同的返回字符串可以正常工作。似乎存在大小问题或与大小相关的问题,这变得越来越令人担忧,因为在返回服务器之前评估大小会很有用。我已经添加到可能有帮助的帖子详细信息中。再次感谢!
  • ic,设置一个错误陷阱怎么样?它应该在未收到状态 200 时工作。
猜你喜欢
  • 2022-11-07
  • 1970-01-01
  • 2023-01-24
  • 2013-02-11
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2013-10-16
  • 2016-03-25
相关资源
最近更新 更多