Вызывается ли Page Unload после того, как ответ покинул IIS?

Я веду журнал диагностики в событии Page_Unload в приложении asp.net, это ведение журнала может занять довольно много времени (около 100 мс). Будет ли поток ответа задержан кодом в обработчике выгрузки страницы? Я мог бы выполнять свою работу асинхронно, используя пул объявлений, но я бы предпочел этого не делать, если это не повлияет на время отклика клиента.

Дополнительная информация:

@thorkia прав в том, что в документации сказано, что Page_Unload вызывается после отправки ответа клиенту, но в моем тестировании (по совету @steve) он действительно блокирует . Я пробовал Casini, IIS Express, Full IIS 7.5 (на тестовом сервере) как с выпуском, так и с отладкой, с подключенным отладчиком и без него. И, цепляясь за соломинку, я попытался указать Async=true в директиве страницы. Я пробовал с Fiddler (потоковая передача включена) и без Fiddler. Я пробовал с IE9 и Firefox. Если документация «правильная», то мне интересно, она действительно отправляет ответ, но, возможно, не «завершает его» (что бы это ни значило, мне нужно будет проверить спецификацию HTTP), и поэтому страница не отображается в браузер? Но я так понимаю, что клиентский браузер начинает отображать страницу, когда он получает байты, для меня это тоже не имеет смысла. Я также пытался посмотреть код в IL Spy, но думаю, что это может занять у меня много времени.

Теперь я заинтригован; Я делаю что-то не так, или документация вводит в заблуждение?


person Daniel James Bryars    schedule 11.10.2011    source источник


Ответы (2)


Почему бы не попробовать?

protected void Page_UnLoad(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine("In Page_UnLoad");
    System.Threading.Thread.Sleep(10000);
    System.Diagnostics.Debug.WriteLine("Leaving Page_UnLoad");
}
person Steve Wellens    schedule 12.10.2011
comment
Правда, это было немного лениво с моей стороны. Я провел некоторое расследование и отредактировал исходный вопрос. +1 Руки хлопнули! - person Daniel James Bryars; 12.10.2011
comment
Вопреки документации он вызывается ДО того, как данные будут отправлены клиенту. - person Daniel James Bryars; 14.10.2011

Согласно MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) этап выгрузки страницы вызывается только после отправки данных клиенту.

Длительное ведение журнала и очистка не повлияют на время ответа клиентов на этот запрос, но могут повлиять на будущие запросы, если много страниц ожидают выгрузки.

person thorkia    schedule 12.10.2011
comment
Запись в Response при выгрузке страницы вызовет исключение. Кроме того, как указал thorkia, блокировка потока запросов для ведения журнала может повлиять на вашу пропускную способность (и, в конечном итоге, на время отклика). Выгрузка работы в поток пула потоков, вероятно, сделает то же самое (поскольку я считаю, что потоки запросов ASP.NET также из пула потоков). С точки зрения масштабируемого дизайна, если время для регистрации значительно больше, чем время для сбора информации, вы, возможно, можете разгрузить регистрацию в отдельной очереди, обслуживаемой выделенными потоками. - person VinayC; 12.10.2011
comment
Я последовал совету @Steve, и похоже, что документация неверна. Я собираюсь обновить вопрос с моими выводами. - person Daniel James Bryars; 12.10.2011