ASP.NET MVC+;jQuery+;IIS6:多个Ajax请求

ASP.NET MVC+;jQuery+;IIS6:多个Ajax请求,asp.net,jquery,asp.net-mvc,iis,iis-6,Asp.net,Jquery,Asp.net Mvc,Iis,Iis 6,我不确定问题出在哪里 我有一个ajax请求,它检查页面上包含包列表的包的跟踪信息: $(".fedex_status").each(function () { var item = this; // some code to construct tracking_url $.ajax({ type: "GET", url: tracking_url, async: true, cache: false,

我不确定问题出在哪里

我有一个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个包(10个具有“fedex_status”类的内容),则会创建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调用会立即返回)


谢谢

每当您找到具有class.fedex\u status的元素时,您都在调用ajax请求

你的线路

美元(“.fedex_状态”)。每个


就是说,每次找到具有class.fedex\u状态的元素时都要这样做。

每次找到具有class.fedex\u状态的元素时,都会调用ajax请求

你的线路

美元(“.fedex_状态”)。每个


就是说每次你发现一个元素的class.fedex_status时都要这样做。

理论上,启用会话状态的ASP.NET会为每个用户请求锁定会话,从而连续处理它们。我不认为可以毫无痛苦地禁用MVC项目的会话,因为例如TempData默认使用会话。但是你可以试试


编辑:这里有一个

理论上,启用会话状态的ASP.NET会为每个用户请求锁定会话,从而连续处理它们。我不认为可以毫无痛苦地禁用MVC项目的会话,因为例如TempData默认使用会话。但是你可以试试


编辑:这里有一个

您的代码在我的机器上按预期工作。我不得不在线程中插入任何人为的延迟。不过,我需要睡觉才能看到它的运行,因为未经处理的请求执行得如此之快,以至于看起来它们都是一下子完成的

 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并连接到内置VisualStudioWeb服务器的快速测试表明,两个请求在客户端上同时执行,并由服务器上的两个不同线程处理

据我所知,浏览器允许的并发请求数量有限。下面是另一篇文章,介绍了每个流行浏览器的每个值:


编辑:我重读了你的帖子,看到你提到了IIS 6。我没有访问IIS 6的权限,但在IIS 7 Web服务器上以5秒的人工超时(Thread.Sleep)运行它表明,不同的服务器线程同时处理多个请求。它们都不是在同一时间启动的,因此服务器上可能会有一些排队,但只要延迟5秒,就很容易看出在Firefox 3.0中,我一次至少有6个并发请求

您的代码在我的机器上正常工作。我不得不在线程中插入任何人为的延迟。不过,我需要睡觉才能看到它的运行,因为未经处理的请求执行得如此之快,以至于看起来它们都是一下子完成的

 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并连接到内置VisualStudioWeb服务器的快速测试表明,两个请求在客户端上同时执行,并由服务器上的两个不同线程处理

据我所知,浏览器允许的并发请求数量有限。下面是另一篇文章,介绍了每个流行浏览器的每个值:


编辑:我重读了你的帖子,看到你提到了IIS 6。我没有访问IIS 6的权限,但在IIS 7 Web服务器上以5秒的人工超时(Thread.Sleep)运行它表明,不同的服务器线程同时处理多个请求。它们都不是在同一时间启动的,因此服务器上可能会有一些排队,但只要延迟5秒,就很容易看出在Firefox 3.0中,我一次至少有6个并发请求

是的,就是这个想法。因此,如果我有10个联邦快递状态匹配项,我想并行调用10个ajax请求,并让每个请求异步返回。现在它们是串行完成的(虽然不是真正同步的…请求会立即返回,因此是异步的,但请求是串行处理的)。我不知道它的客户端或服务器端是串行的,而不是并行的。请求不会并行运行,因为你一个接一个地调用它们!我对JSON了解不多,但是您可以在一个ajax请求中返回JSON中的信息,然后循环JSON并将数据插入dom。不确定只是一个想法。所以一次只能有一个ajax请求?有
async:true
标志,所以请求a是并行发送的,但在服务器端是串行处理的。顺便说一句,我建议您使用Fiddler之类的工具来调试HTTP会话。@Rigobert在这里搞错了。一次可以有多个AJAX请求!AJAX对象中指定的回调在请求返回时被调用,因此.Each()函数在请求完成之前不会阻塞;它会在发送请求后立即继续,并且该请求在浏览器的后台线程上运行。