我有一个自定义的http模块,可以对请求进行一些后期处理。此处理在PostRequestHandlerExecute事件期间运行,并修改SessionState。
我有第三方控件正在实现自己的Callback机制。本质上,组件在控件的Render事件中将一些XML呈现给缓冲区,之后它调用Response.End()。
因为它调用了Response.End(),所以管道中没有其他事件被触发。我正在试图找到一种方法来让我的自定义模块运行此后处理代码。我可以挂钩到EndRequest事件,但此时,Session已不再可用。
修改 具体来说,我需要做的是修改会话状态中两个特定插槽的值。一个是值类型,一个是引用类型。我也在使用InProcess会话状态 任何想法或建议?
答案 0 :(得分:2)
尽管Response.End
(建议使用HttpApplication.CompleteRequest)短路应用程序事件,但会话状态模块仍会在结束请求时保持会话状态。每当会话状态模块持续会话状态时,它将从上下文中删除会话包。
因此,执行此操作的其中一种方法可能是在模块中使用标记。如果PostRequestHandlerExecute
被触发,请设置标志。处理EndRequest
并且如果未设置标志,则进行会话状态操作。为了获得会话状态,清除web.config中的所有模块并将模块放在会话状态模块之前(通常观察模块按注册顺序接收应用程序事件)。
更清洁的方法是拥有你的own session state store provider - 这样你就可以根据你的模块中用来操作会话槽的会话ID来公开获取会话状态包的方法。