如何减少/消除AJAX请求中的等待时间/延迟

时间:2012-03-08 21:32:51

标签: ajax asp.net-mvc performance asp.net-mvc-3 mvc-mini-profiler

我有一个ASP.NET MVC3项目,其中主要的aspx页面使用jQuery ajax对其部件进行动态加载。所以基本上当网站加载时,它命中/ Home / Index然后在Index(aspx)视图中,有几行jQuery进行ajax调用(到/ Home / PartOne和/ Home / PartTwo来填充页面的部分内容)。

因此,每次页面加载时,它基本上都会执行3个请求:获取索引,获取PartOne,然后是PartTwo。

问题:为什么执行第三个请求会有某种“等待”时间?我认为这是浏览器并发请求限制,但为什么不在第一个请求完成后执行?

当我通过实验性地将“OutputCache”属性放在“PartTwo”上时,它的行为与预期一致,即它正在快速执行。这暗示问题不在IIS中,而是在此之后以及在它触及我的action方法之前的某个地方。

以下是Chrome网络探道器的屏幕截图: Chrome network profiler

这是MvcMiniProfiler上的屏幕截图 - 查看第3行/值,它在执行我的控制器动作代码之前等待500ms。 enter image description here

我的控制器代码如下所示。虽然我剪断了实际代码,但是PartTwo的代码非常简单(没有长时间计算,没有数据库调用等):

public class HomeController : Controller {
    public ActionResult Index() {
        // do something here
        return View();
    }

    public ActionResult PartOne() {
        // do something here
        return View();
    }

    public ActionResult PartTwo() {
        // do something here
        return View();
    }
}

我的javascript:

$(document).ready(function () {
    $.ajax({
        url: "/Home/PartOne",
        cache: false,
        success: function (data, textStatus, request) {
            $("#TestContainerOne").html(data);
        }
    });

    $.ajax({
        url: "/Home/PartTwo",
        cache: false,
        success: function (data, textStatus, request) {
            $("#TestContainerTwo").html(data);
        }
    });
});

我的index.aspx:

<h2>Home page</h2>    
<div id="TestContainerOne"></div>
<div id="TestContainerTwo"></div>

PartOne.ascx:

<h2>Part One</h2>

PartTwo.ascx:

<h2>Part Two</h2>

帮助?

1 个答案:

答案 0 :(得分:7)

您应该使用只读会话状态或完全禁用它,以便并行处理Ajax请求。默认情况下,服务器会锁定来自同一客户端的请求的会话状态,因此请求将按顺序执行。

这是通过使用SessionState属性装饰您的控制器来完成的:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class HomeController : Controller {
    public ActionResult Index() {
        // do something here
        return View();
    }

    public ActionResult PartOne() {
        // do something here
        return View();
    }

    public ActionResult PartTwo() {
        // do something here
        return View();
    }
}