在forums.asp.net上问这个但没有接受者,所以我想我会在这里试试。
我们有一个注册BeginRequest,ReleaseRequestState和EndRequest的HttpModule。该模块的主要目的是,当我们提供常规html页面时,我们需要一个钩子来重写和加密生成的html中hrefs上的查询字符串。过滤附加在我们模块的ReleaseRequestState事件处理程序中(context.Response.Filter = new MyFilter(...);)。
但是当我们运行一个会导致xml文档的页面时,ReleaseRequestState事件处理程序似乎根本不会触发 - 只有BeginRequest和EndRequest。
经过大量的谷歌搜索,我发现帖子说HttpApplication.CompleteRequest()将绕过很多事件链并直接转到EndRequest,但我们无处调用CompleteRequest()。因此,我认为还有其他一些东西可以调用它,或者绕过ReleaseRequestState的其他方式。
当我们设置生成报告xml时,我们做一个Response.Clear();然后在Response.OutputStream上创建一个XmlWriter。其中任何一个会导致更低的东西绕过ReleaseRequestState事件吗?
答案 0 :(得分:0)
因为您正在提供XML文档,所以ASP.NET管道是短路的 - 因为没有执行使用它的aspx页面,所以没有要发布的状态。
你可以做些什么来确保你使用XML文档的请求发布会话状态表单变量。当框架看到变量(和/或其他与状态有关的请求参数)时,它将执行完整的状态水合/脱水事件循环。
编辑:
在考虑了这个之后,我认为这是对Response.Clear()
的调用导致状态事件无法触发。该方法将清除现有内容,包括请求中包含的状态变量。由于您似乎可能在Response.Clear
事件处理程序中调用BeginRequest
,因此在解析并在后续事件中设置状态之前,将从请求中清除状态。因此,没有要释放的状态,并且正在跳过事件调用。
您是否已在ASP.NET源代码下载/指出了符号源并逐步完成了请求?这有助于更好地回答这个问题。