Этот пробудил моё любопытство, поэтому я немного вкопался в него;извините за некромантию.
Я создал простой проект, который связывал уведомления для каждого события жизненного цикла в объекте приложения и устанавливал точки останова для каждого из них.
Оказывается, когда "Требуется SSL"установлен, и вы получаете доступ без SSL, большинство событий полностью пропущены.Первое событие сработало LogRequest
, за которым следуют PostLogRequest
, EndRequest
, PreSendRequestContent
и PreSendRequestHeaders
(в этом порядке).Другие события не запускаются.
Таким образом, ваш код зависал, потому что событие BeginRequest
никогда не запускалось, и делегат EndRequest
пытался Dispose()
что-то, что никогда не было создано.
Что мне интересно, так это выяснить почему IIS ведет себя так.Я подозреваю, что причина в том, что IIS по-прежнему необходимо регистрировать недопустимые попытки подключения, а также отправлять содержимое и заголовки, даже если запрашиваемый ресурс требует SSL.Что-то должно генерировать эту дружественную «запрещенную» страницу, в конце концов.То, что я не знаю, это то, почему EndRequest
вызывается вообще, когда они не удосужились позвонить BeginRequest
;Я предполагаю, что есть некоторый код очистки IIS / ASP, который зависит от него.
Это поведение зависит от того, работает ли пул приложений в "Интегрированном" или "Классическом" режиме.В «классическом» режиме все события ASP.NET запускаются «между» событиями IIS PreRequestHandlerExecute
и PostRequestHandlerExecute
.Вы не сказали, что запускаете, но это должно быть интегрировано;в противном случае вы бы увидели ожидаемое поведение, т. е. ни один из вашего кода не был бы выполнен вообще.
Интересно, если вы попытаетесь подписаться на LogRequest
, PostLogRequest
или MapRequestHandler
события в классическом режиме, вы получаете исключение во время выполнения;это только «имеет смысл» в контексте интегрированного конвейера.