我不确定问题出在哪里......
我有一个ajax请求,用于检查包含列表包的页面上包的跟踪信息:
$(".fedex_status").each(function() {
var item = this;
// some code to construct tracking_url
$.ajax({
type: "GET",
url: tracking_url,
async: true,
cache: false,
success: function(data) { $(item).html("(" + data + ")"); },
error: function() { $(item).html("request failed...");}
});
});
因此,如果页面上有10个包(带有'fedex_status'类的10个包),则会创建10个请求。请求工作正常,但一次返回一个结果(以串行方式)。我在控制器操作中为请求的开始和停止添加了一个时间戳:
public ActionResult Fedex(string trackingNumber)
{
DateTime requestStart = DateTime.Now;
TrackingService tracking = new TrackingService();
string status = tracking.FedexTrackingNumberStatus(trackingNumber);
return Content(status + " - " + requestStart.ToString("hh:mm:ss.FFF") + " - " + DateTime.Now.ToString("hh:mm:ss.FFF"));
}
没有时间戳重叠。因此控制器一次处理一个请求。这看起来很糟糕。
现在,ajax请求'应该'是并行的。它肯定会立即返回(它的异步)。当我查看IIS日志时,请求具有与控制器操作返回相同的时间戳。
所以我的问题是:jquery是不是并行发送所有的ajax请求,还是IIS或ASP.NET只是串行处理请求。我是IIS的大菜鸟和ASP.NET的技术细节,所以它可能是永远错误配置的,并且一次只响应一个请求(仅限内部使用,流量低)。也就是说,我也是jquery的白痴,不确定如何测试请求实际被解雇(我所知道的是$ .ajax调用立即返回)。
谢谢!
答案 0 :(得分:5)
理论上,启用了会话状态的ASP.NET会锁定每个用户请求的会话,从而以串行方式处理它们。我不认为你可以无痛地禁用MVC项目的Session,因为TempData例如默认使用session。但你可以试试。
编辑:这是related question
答案 1 :(得分:1)
您的代码在我的计算机上按预期工作。我不得不使用Thread.Sleep插入任何人为的延迟来查看它的实际效果,因为执行的请求非常快,看起来它们都是一次完成的。
System.Threading.Thread.Sleep(1000);
return Content(String.Format("Thread #{0}, Started = {1:hh:mm:ss.FFF}, Completed = {2:hh:mm:ss.FFF}, Duration = {3:hh:mm:ss.FFF}, Result = {4}",
System.Threading.Thread.CurrentThread.ManagedThreadId,
requestStart,
DateTime.Now,
DateTime.Now.Subtract(requestStart),
status));
使用Firefox对我的计算机进行快速测试并连接到内置的Visual Studio Web服务器,显示两个请求在客户端上同时执行,并由服务器上的两个不同线程处理。
据我所知,浏览器允许的允许并发请求数量有限。这是SO上的另一篇文章,涵盖了每个热门浏览器的每个值:How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?
编辑:我重读了你的帖子,看到你提到了IIS 6.我无法访问IIS 6,但是在IIS 7 Web服务器上运行它有5秒的人工超时(Thread.Sleep)显示了多个请求由不同的服务器线程同时处理。它们都没有在同一时间开始,所以服务器上可能会有一些排队,但延迟5秒,很容易看出在Firefox 3.0中我一次至少有6个并发请求。答案 2 :(得分:0)
每次找到类.fedex_status的元素时,都在调用ajax请求。
你的行
$( “fedex_status”)。每个
每次你找到一个带有.fedex_status类的元素时都会这样做。