首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么对同一个ASP.NETMVC操作的多个同时Ajax调用会导致浏览器阻塞?

为什么对同一个ASP.NETMVC操作的多个同时Ajax调用会导致浏览器阻塞?
EN

Stack Overflow用户
提问于 2018-03-13 04:58:40
回答 2查看 0关注 0票数 0

我在同一个控制器动作下几乎同时触发了六个jQuery异步ajax请求。每个请求需要10秒钟才能返回。

通过调试和记录对操作方法的请求,我注意到这些请求是序列化的并且从不并行运行。即我在我的log4net日志中看到一个时间线,如下所示:

代码语言:txt
复制
2010-12-13 13:25:06,633 [11164] INFO   - Got:1156
2010-12-13 13:25:16,634 [11164] INFO   - Returning:1156
2010-12-13 13:25:16,770 [7124] INFO   - Got:1426
2010-12-13 13:25:26,772 [7124] INFO   - Returning:1426
2010-12-13 13:25:26,925 [11164] INFO   - Got:1912
2010-12-13 13:25:36,926 [11164] INFO   - Returning:1912
2010-12-13 13:25:37,096 [9812] INFO   - Got:1913
2010-12-13 13:25:47,098 [9812] INFO   - Returning:1913
2010-12-13 13:25:47,283 [7124] INFO   - Got:2002
2010-12-13 13:25:57,285 [7124] INFO   - Returning:2002
2010-12-13 13:25:57,424 [11164] INFO   - Got:1308
2010-12-13 13:26:07,425 [11164] INFO   - Returning:1308

查看Firefox中的网络时间线,我看到以下内容:

上面的日志示例和Firefox网络时间线都是针对同一组请求。

来自同一页面的同一动作的请求是否已序列化?我知道Session在同一会话中对对象的序列化访问,但没有会话数据被触摸。

我将客户端代码剥离为单个请求(最长的一个),但是这仍然会阻止浏览器,即只有当ajax请求完成时,浏览器才会响应任何链接单击。

我在这里(在Chrome的开发人员工具中)观察到的是,当长时间运行的ajax请求正在执行时,点击链接时,它会Failed to load resource立即报告错误,表明浏览器已经杀死(或试图杀死并等待?)ajax请求:

但浏览器仍需要一个年龄才能重定向到新页面。

ajax请求是否真的是异步的,或者是这样的手段,因为javascript实际上是单线程的?

我的请求是否需要很长时间才能发挥作用?

Firefox和IE也会出现问题。

我还将脚本更改为$.ajax直接使用并明确设置async: true

我在IIS7.5上运行这个,Windows 2008R2和Windows 7都做同样的事情。

调试版本和发布版本的行为也是一样的。

EN

回答 2

Stack Overflow用户

发布于 2018-03-13 13:27:58

答案是在我面前凝视着我。

ASP.NET会话状态概述: 访问ASP.NET会话状态是每个会话独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果为同一会话创建两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权限。第二个请求仅在第一个请求完成后执行。

令人讨厌的是,我几周前已经略过了这段话,但并没有真正接受这些大胆的句子的全部影响。如果请求来自同一个会话,我已经读过,只是“访问会话状态是序列化的”,而不是“所有请求,无论你是否触及会话状态,都是序列化的”

幸运的是,在ASP.NET MVC3中有一种解决方法,它可以创建无会话控制器。Scott Guthrie在这里谈论这些:

宣布ASP.NET MVC 3(Release Candidate 2)

我安装了MVC3 RC2并升级了该项目。有问题的控制器装饰[SessionState(SessionStateBehavior.Disabled)]解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2018-03-13 14:20:22

我试着复制这个,但无法复制。这是我的测试:

代码语言:txt
复制
private static readonly Random _random = new Random();

public ActionResult Ajax()
{
    var startTime = DateTime.Now;
    Thread.Sleep(_random.Next(5000, 10000));
    return Json(new { 
        startTime = startTime.ToString("HH:mm:ss fff"),
        endTime = DateTime.Now.ToString("HH:mm:ss fff") 
    }, JsonRequestBehavior.AllowGet);
}

调用:

代码语言:txt
复制
<script type="text/javascript" src="/scripts/jquery-1.4.1.js"></script>
<script type="text/javascript">
    $(function () {
        for (var i = 0; i < 6; i++) {
            $.getJSON('/home/ajax', function (result) {
                $('#result').append($('<div/>').html(
                    result.startTime + ' | ' + result.endTime
                ));
            });
        }
    });
</script>

<div id="result"></div>

其结果是:

代码语言:txt
复制
13:37:00 603 | 13:37:05 969
13:37:00 603 | 13:37:06 640
13:37:00 571 | 13:37:07 591
13:37:00 603 | 13:37:08 730
13:37:00 603 | 13:37:10 025
13:37:00 603 | 13:37:10 166

和FireBug控制台:

正如你所看到的,AJAX动作是并行的。

尝试设置cache: false

代码语言:txt
复制
$.ajax({
    url: '/home/ajax', 
    cache: false,
    success: function (result) {
        $('#result').append($('<div/>').html(
            result.startTime + ' | ' + result.endTime
        ));
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档