Как «Требуется SSL» влияет на жизненный цикл приложения ASP.NET MVC? - PullRequest
12 голосов
/ 16 июня 2010

У меня есть приложение, которое подключается к BeginRequest и EndRequest для настройки и завершения сеансов NHibernate, например:

BeginRequest += delegate
{
    CurrentSessionContext.Bind(SessionFactory.OpenSession());
};

EndRequest += delegate
{
    var session = CurrentSessionContext.Unbind(SessionFactory);
    session.Dispose();

    Container.Release(session);
};

Это прекрасно работает при развертывании в IIS, пока я не проверю "«Требовать SSL».Как только я это сделаю, я получаю NullReferenceException на session.Dispose().

. Я еще не отлаживал это, и, да, исправление тривиально, но мне просто любопытно, как «Требовать SSL»влияет на жизненный цикл запроса.Не установлен ли сеанс на сервере в этих случаях?

РЕДАКТИРОВАТЬ : просто чтобы уточнить, я имею в виду параметр «Требовать SSL» в конфигурации IIS для приложения, а неатрибут RequireHttps для контроллеров.

Ответы [ 2 ]

5 голосов
/ 14 марта 2011

Этот пробудил моё любопытство, поэтому я немного вкопался в него;извините за некромантию.

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

Оказывается, когда "Требуется 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события в классическом режиме, вы получаете исключение во время выполнения;это только «имеет смысл» в контексте интегрированного конвейера.

0 голосов
/ 09 февраля 2011

Вот кое-что, что может вам помочь

Обзор жизненного цикла приложений ASP.NET для IIS 5.0 и 6.0

Обзор жизненного цикла приложений ASP.NET для IIS 7.0

Возможно, вы захотите сделать то же, что и в global.asax.

...