ASP.NET MVC + jQuery + IIS6: несколько запросов Ajax - PullRequest
1 голос
/ 14 мая 2009

Я не уверен, где проблема ...

У меня есть запрос 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 немедленно возвращается).

Спасибо!

Ответы [ 3 ]

5 голосов
/ 14 мая 2009

Теоретически ASP.NET с включенным состоянием сеанса блокирует сеанс для каждого пользовательского запроса, обрабатывая их последовательно. Я не думаю, что вы можете безболезненно отключить Session для проекта MVC, потому что TempData, например, использует session по умолчанию Но вы можете попробовать.

РЕДАКТИРОВАТЬ: вот связанный вопрос

1 голос
/ 14 мая 2009

Ваш код работает, как и ожидалось, на моей машине. Мне пришлось вставить любую искусственную задержку в 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 показал, что на клиенте одновременно выполнялись два запроса и обрабатывались двумя разными потоками на сервере.

Насколько я знаю, существует ограниченное количество разрешенных одновременных запросов, разрешенных браузером. Вот еще один пост, посвященный SO, который описывает каждое значение для каждого из популярных браузеров: Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?

РЕДАКТИРОВАТЬ: я перечитал ваш пост и увидел, что вы упомянули IIS 6. У меня нет доступа к IIS 6, но запуск его на веб-сервере IIS 7 с 5-секундным искусственным таймаутом (Thread.Sleep) показал, что несколько запросов обрабатывались одновременно разными серверными потоками. Ни один из них не запускается одновременно с EXACT, поэтому на сервере могут происходить очереди, но с 5-секундной задержкой легко увидеть, что в Firefox 3.0 у меня одновременно есть как минимум 6 одновременных запросов.

0 голосов
/ 14 мая 2009

Вы вызываете свой ajax-запрос каждый раз, когда находите элемент с классом .fedex_status.

Ваша линия

$ ( "fedex_status"). Каждый

говорит делать это каждый раз, когда вы находите элемент с классом .fedex_status.

...