【问题标题】:SessionStateModule vs runAllManagedModulesForAllRequests="true"SessionStateModule 与 runAllManagedModulesForAllRequests="true"
【发布时间】:2013-11-01 12:40:55
【问题描述】:

目前我设置了runAllManagedModulesForAllRequests="true" 属性,因此我的模块正在针对所有请求运行。我猜这包括SessionStateModule

在我的一个自定义模块中尝试访问 PostAcquireRequestState 事件处理程序中的会话对象时,HttpContext.Current.Session 为 null 而 HttpApplication.Context.CurrentHandler 为空(例如:对于 JS/CSS 文件),并且它当处理程序为 MvcHandler 时不为空(因为我猜它是托管处理程序)。

我一直在查看 ILSpy 中的 SessionStateModule 代码,但我找不到为该请求决定跳过会话的位置。

我一直在查看%windir%\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config,但没有提到SessionStateModule,我在该文件夹中的Web.config 中找到了:

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

所以它没有使用像managedHandler这样的任何前置条件。

有人知道为什么SessionStateModule 会跳过对非托管资源的请求,即使设置了属性runAllManagedModulesForAllRequests

干杯。

【问题讨论】:

    标签: asp.net iis-7 iis-7.5 httpmodule integrated-pipeline-mode


    【解决方案1】:

    似乎 IIS 使用托管处理程序前提条件加载默认模块以确保向后兼容性。 http://forums.iis.net/post/1904024.aspx

    【讨论】:

    • 根据此链接:iis.net/learn/get-started/introduction-to-iis/… 当您 runAllManagedModulesForAllRequests=true 时,preCondition 无效。这种行为可能会因管道模式(集成或经典)而有所不同。您可能可以添加您正在使用的管道模式。
    猜你喜欢
    • 2012-06-18
    • 2012-09-11
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多