Как уменьшить / устранить время ожидания / задержку в AJAX-запросе - PullRequest
6 голосов
/ 09 марта 2012

У меня есть проект ASP.NET MVC3, в котором главная страница aspx выполняет динамическую загрузку своих частей с помощью jQuery ajax. Таким образом, в основном, когда сайт загружается, он обращается к / Home / Index, а затем в представлении Index (aspx), есть несколько строк jQuery, которые делают вызовы ajax (в / Home / PartOne и / Home / PartTwo для заполнения частей страницы.

Таким образом, каждый раз, когда страница загружается, она в основном выполняет 3 запроса: получить индекс, получить PartOne, а затем PartTwo.

Вопрос: почему существует какое-то время ожидания для выполнения третьего запроса? Я думал, что это был предел одновременных запросов браузера, но почему он не выполняется после выполнения 1-го запроса?

Когда я экспериментально помещаю атрибут «OutputCache» в «PartTwo», он ведет себя так, как ожидалось, что он выполнялся быстро. Это намекает на то, что проблема не в IIS, а где-то после этого и до того, как он достигнет моего метода действия.

Вот скриншот из профилировщика сети Chrome: Chrome network profiler

Вот снимок экрана на MvcMiniProfiler - посмотрите на 3-ю строку / значение, она ждет 500 мс, прежде чем выполнить код действия моего контроллера. 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 Ответ

7 голосов
/ 09 марта 2012

Вы должны использовать состояние сеанса только для чтения или полностью его отключить, чтобы получить параллельную обработку запросов 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();
    }
}
...