IIS много задерживает между каждым ответом с асинхронными запросами - PullRequest
8 голосов
/ 22 сентября 2011

У меня запущен проект ASP.NET MVC на компьютере разработчика с Windows 7 Ultimate и iis 7.5.

Я делаю следующее:

var requests = ["http://myserver.com/news/details/113834",
"http://myserver.com/tag/details?ids=113834&entityType=23",
"http://myserver.com/publish/details?ids=113834&entityType=23",
"http://myserver.com/generalproperty/details?ids=113834&entityType=23",
"http://myserver.com/category/details?ids=113834&entityType=23"];

var f = new Date().getTime();
$.each(requests, function(k,v) {
    $.ajax({
    url :v,
    async : true,
    type :'get',
    success : function(data) {
        console.log(new Date().getTime()  -f );
    }});
})

Затем я получаю следующие результаты(приблизительно) 12, 521, 1025, 1550, 2067 результат асинхронизации http://martinhansen.no/hostedimages/async.PNG

Если я переключу асинхронный режим на ложный, я получу: 14,32,49,58,68 результат синхронизации http://martinhansen.no/hostedimages/sync.PNG

Кажется, где-то запросы ставятся в очередь, и через некоторое время он отвечает только каждые 500 секунд.Я заставил мои контроллеры возвращать пустой текст вместо вызова базы данных, а не базы данных.

Есть ли ограничения на IIS 7.5 для windows 7?Настройки я могу изменить?Я подозреваю, что максимальное количество одновременных запросов на пользователя или что-то подобное.И тогда он «наказывает» вас, отвечая только каждые 500 мс.Чтобы люди не использовали его в качестве фактического сервера.

Вероятно?И есть ли способ избежать этого?

Ответы [ 2 ]

9 голосов
/ 22 сентября 2011

Это не имеет ничего общего с IIS или IIS на Windows 7, я также пробовал на тестовом сервере и те же результаты.

Это было из-за ограничений, наложенных сессионным состоянием, см. Раздел «Параллельные запросы и состояние сеанса» внизу здесь: http://msdn.microsoft.com/en-us/library/ms178581.aspx

Однако, если два одновременных запроса сделаны для одного и того же сеанса (с использованием одного и того же значения SessionID), первый запрос получает эксклюзивный доступ к информации сеанса. Второй запрос выполняется только после того, как первый запрос завершен.

Но я все еще не понимаю, почему он не запускает следующий запрос сразу после того, как первый, казалось бы, закончен. Кажется, очень фальшивая задержка в 500 мс.

Я пришел к этому вопросу Как установить тайм-аут LOCK для чтения и записи ASP.NET SessionState? , который говорит о времени блокировки для состояния сеанса.

System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500

Это магическое число, которое я искал в своем коде и в интервалах ... 500! Я знал, что это должно быть где-то.

В любом случае, чтобы исправить это, я добавил атрибут sessionstate в мои контроллеры с опцией «только для чтения»

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class BaseController : Controller{} 

Подробнее об этом:

http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx

http://weblogs.asp.net/imranbaloch/archive/2010/07/10/concurrent-requests-in-asp-net-mvc.aspx

Я все еще думаю, что что-то не так, почему предыдущий запрос не сообщает системе, что ему больше не нужна блокировка состояния сеанса, чтобы следующий запрос мог быть выполнен?

0 голосов
/ 22 сентября 2011

Сколько запросов вы отправляете одновременно?IIS на клиентских ОС ограничен 10 одновременными подключениями .Выше этого предела он выбрасывает входящее соединение в очередь и обрабатывает его при открытии слота.

Это было долгое время в попытках MS гарантировать, что клиентские ОС не используютсяканнибализировать продажи своих серверных операционных систем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...