我在同一个控制器动作下几乎同时触发了六个jQuery异步ajax请求。每个请求需要10秒钟才能返回。
通过调试和记录对操作方法的请求,我注意到这些请求是序列化的并且从不并行运行。即我在我的log4net日志中看到一个时间线,如下所示:
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都做同样的事情。
调试版本和发布版本的行为也是一样的。
发布于 2018-03-13 13:27:58
答案是在我面前凝视着我。
ASP.NET会话状态概述: 访问ASP.NET会话状态是每个会话独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果为同一会话创建两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权限。第二个请求仅在第一个请求完成后执行。
令人讨厌的是,我几周前已经略过了这段话,但并没有真正接受这些大胆的句子的全部影响。如果请求来自同一个会话,我已经读过,只是“访问会话状态是序列化的”,而不是“所有请求,无论你是否触及会话状态,都是序列化的”。
幸运的是,在ASP.NET MVC3中有一种解决方法,它可以创建无会话控制器。Scott Guthrie在这里谈论这些:
我安装了MVC3 RC2并升级了该项目。有问题的控制器装饰[SessionState(SessionStateBehavior.Disabled)]
解决了这个问题。
发布于 2018-03-13 14:20:22
我试着复制这个,但无法复制。这是我的测试:
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);
}
调用:
<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>
其结果是:
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
:
$.ajax({
url: '/home/ajax',
cache: false,
success: function (result) {
$('#result').append($('<div/>').html(
result.startTime + ' | ' + result.endTime
));
}
});
https://stackoverflow.com/questions/-100007598
复制相似问题