2017-02-13 5 views
0

У меня есть стандартное приложение ASP.NET (Web Forms), работающее на IIS8 и получающее жалобы, которые иногда требуют слишком много времени для обработки запросов.Внутренняя задержка между HTTP-модулем и обработчиком HTTP в ASP.NET

После глубокого исследования и регистраций я понял, что задержки происходят везде, где после окончания PreRequestHandlerExecute события в моем последнем модуле HTTP и до ProcessRequest события в моей обработчик HTTP.

Насколько я понимаю, у меня нет никакого кода между ними, и эта часть конвейера полностью управляется инфраструктурой IIS и ASP.NET. Я также видел, что идентификатор потока обработки модуля и обработчика изменяется, когда происходят задержки.

Я прочитал тонну документации и не приблизился к решению :(

Что может быть причиной этих задержек?

Заранее спасибо

+0

Включает ли ваш обработчик [IRequiresSessionState] (https://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate (v = vs.110) .aspx)? Задержка может быть связана с блокировкой/блокировкой данных сеанса. –

+0

Джон, спасибо за ваш ответ. Мой обработчик действительно реализует и использует Session. Есть ли какие-либо решения для этих замков? – Skatrix

+0

Я добавил ответ, чтобы обратиться к замкам, но похоже, что это не ваша проблема. –

ответ

0

Вашего сайта не медленный: он ждет.

ASP.NET позволяет только одному потоку выполнять идентификатор сеанса. Если у пользователя две открытые вкладки и пытается отправить два веб-запроса с тем же идентификатором сеанса, второй поток будет блокироваться до тех пор, пока первое завершено.

См. Этот вопрос для обсуждения и несколько различных решений: I just discovered why all asp.net websites are slow.

Самый простой ответ: если обработчику нужен только доступ для чтения к переменным сеанса, используйте IReadOnlySessionState вместо IRequireSessionState. Это позволит обработчику выполнять одновременно по крайней мере с самим собой.

Вы можете использовать Microsoft's brand new async session state module, недавно выпущенный. Он должен работать. Если да, обязательно ответьте this question.

+0

Спасибо за ваш ответ, но, к сожалению, это не так :(Я знаю об ограничении «один сеанс за браузер», но задержки, которые я вижу, не относятся ко второму запросу, заблокированному первым, но к первому запросу получить задержку там, где в IIS. – Skatrix

+0

BTW, исследуя эту проблему на стороне сервера, я отметил несколько дополнительных пунктов. Прежде всего, на сервере я вижу, что идентификатор потока, обрабатывающего запрос, изменяется после задержки. чтобы включить журнал ошибок Failed Request, но по какой-то причине я получаю неполный журнал. В сводке запросов я вижу, что для выполнения некоторого запроса потребовалось 40 секунд, но журнал только отображает подробный журнал только до момента начала задержки (запись журнала GENERAL_READ_ENTITY_START) . И затем ломает паузы ...: (( – Skatrix

Смежные вопросы