0

在 forums.asp.net 上问过这个问题,但没有人接受,所以我想我会在这里尝试。

我们有一个注册 BeginRequest、ReleaseRequestState 和 EndRequest 的 HttpModule。该模块的主要目的是,当我们提供常规 html 页面时,我们需要一个钩子来重写和加密生成的 html 中 href 上的查询字符串。过滤附加在我们模块的 ReleaseRequestState 事件处理程序中 (context.Response.Filter = new MyFilter(...);)。

但是当我们运行一个将生成 xml 文档的页面时,ReleaseRequestState 事件处理程序似乎根本不会触发 - 只有 BeginRequest 和 EndRequest。

经过大量谷歌搜索,我发现帖子说 HttpApplication.CompleteRequest() 将绕过很多事件链并直接转到 EndRequest,但我们没有在任何地方调用 CompleteRequest()。所以我在想还有其他的东西可以调用它,或者其他绕过 ReleaseRequestState 的方法。

当我们设置生成报告 xml 时,我们执行 Response.Clear(); 然后在 Response.OutputStream 上创建一个 XmlWriter。这些中的任何一个都会导致一些较低的东西绕过 ReleaseRequestState 事件吗?

4

1 回答 1

0

因为您提供的是 XML 文档,所以 ASP.NET 管道是短路的 - 没有要发布的状态,因为没有执行使用它的 aspx 页面。

为了解决这个问题,您可以做的是确保您正在发布会话状态表单变量以及对 XML 文档的请求。当框架看到该变量(和/或与状态有关的其他请求参数)时,它将执行完整的状态水合/脱水事件循环。

编辑:在考虑了更多之后,我认为这Response.Clear()是导致状态事件不触发的调用。该方法将清除现有内容,包括请求中包含的状态变量。由于看起来您可能正在事件处理程序中调用Response.ClearBeginRequest因此在后续事件中解析和设置状态之前,正在从请求中清除状态。因此,没有要释放的状态,并且正在跳过事件调用。

您是否已在 ASP.NET 源中下载/指向符号源并单步执行请求?这将有助于更好地回答这个问题。

于 2013-03-04T16:12:07.833 回答