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

时间:2009-05-13 21:17:23

标签: 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, 
         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调用立即返回)。

谢谢!

3 个答案:

答案 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类的元素时都会这样做。