调用Response.End()后访问会话

时间:2011-11-15 00:12:37

标签: asp.net

我有一个自定义的http模块,可以对请求进行一些后期处理。此处理在PostRequestHandlerExecute事件期间运行,并修改SessionState。

我有第三方控件正在实现自己的Callback机制。本质上,组件在控件的Render事件中将一些XML呈现给缓冲区,之后它调用Response.End()。

因为它调用了Response.End(),所以管道中没有其他事件被触发。我正在试图找到一种方法来让我的自定义模块运行此后处理代码。我可以挂钩到EndRequest事件,但此时,Session已不再可用。

修改 具体来说,我需要做的是修改会话状态中两个特定插槽的值。一个是值类型,一个是引用类型。我也在使用InProcess会话状态 任何想法或建议?

1 个答案:

答案 0 :(得分:2)

尽管Response.End(建议使用HttpApplication.CompleteRequest)短路应用程序事件,但会话状态模块仍会在结束请求时保持会话状态。每当会话状态模块持续会话状态时,它将从上下文中删除会话包。

因此,执行此操作的其中一种方法可能是在模块中使用标记。如果PostRequestHandlerExecute被触发,请设置标志。处理EndRequest并且如果未设置标志,则进行会话状态操作。为了获得会话状态,清除web.config中的所有模块并将模块放在会话状态模块之前(通常观察模块按注册顺序接收应用程序事件)。

更清洁的方法是拥有你的own session state store provider - 这样你就可以根据你的模块中用来操作会话槽的会话ID来公开获取会话状态包的方法。