1

На данный момент у меня есть атрибут runAllManagedModulesForAllRequests="true", поэтому мои модули работают для всех запросов. Я предполагаю, что это включает SessionStateModule.SessionStateModule vs runAllManagedModulesForAllRequests = "true"

При попытке получить доступ к объекту сеанса в обработчик PostAcquireRequestState событий в одном из моих собственных модулей, то HttpContext.Current.Session равно нулю, когда HttpApplication.Context.CurrentHandler равна нулю (например: для файла JS/CSS), и это не является нулевым, когда обработчик MvcHandler (потому что это управляемый обработчик, я думаю).

Я смотрю на код SessionStateModule в ILSpy, и я не мог найти, где принимает решение пропустить сеанс для этого запроса.

Я смотрел в %windir%\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config и нет никакого упоминания о SessionStateModule, и в Web.config в этой папке я нашел:

<add name="Session" type="System.Web.SessionState.SessionStateModule" /> 

Так что не использует никакого предусловия как managedHandler.

Кто-нибудь знает, почему SessionStateModule пропускает запросы для не управляемых ресурсов, даже если установлен атрибут runAllManagedModulesForAllRequests?

Cheers.

ответ

3

Кажется, что IIS загружает модули по умолчанию с предварительным условием управляемого обработчика для обеспечения обратной совместимости. http://forums.iis.net/post/1904024.aspx

+0

По этой ссылке: http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Precondition, когда у вас есть runAllManagedModulesForAllRequests = истина, Precondition не имеет никакого эффекта , Такое поведение может отличаться в зависимости от режима конвейера (интегрированный OR classic). Вероятно, вы могли бы добавить, какой режим конвейера вы используете. – dotnetguy