【问题标题】:ASP.NET HttpApplication.EndRequest event not firedASP.NET HttpApplication.EndRequest 事件未触发
【发布时间】:2008-10-27 13:07:50
【问题描述】:

根据this MSDN article HttpApplication.EndRequest 可用于关闭或处置资源。但是,此事件不会在我的应用程序中触发/调用。

我们通过以下方式在 Page_Load 中附加处理程序:

HttpContext.Current.ApplicationInstance.EndRequest += ApplicationInstance_EndRequest;

唯一的方法是使用 Global.asax 中的 Application_EndRequest 处理程序,但这对我们来说是不可接受的。

【问题讨论】:

  • 如果您提供有关您尝试处置哪些资源以及如何使用它们的更多信息,有人可以告诉您应该在哪里执行此操作。

标签: .net asp.net


【解决方案1】:

如果您不想使用 global.asax,可以使用自己的 HttpModule 来捕获 EndRequest。

public class CustomModule : IHttpModule 
{
    public void Init(HttpApplication context)
    {
        context.EndRequest += new EventHandler(context_EndRequest);
    }

    private void context_EndRequest(object sender, EventArgs e)
    {
        HttpContext context = ((HttpApplication)sender).Context;
        // use your contect here
    }
}

您需要将模块添加到您的 web.config 中

<httpModules>
    <add name="CustomModule" type="CustomModule"/>
</httpModules>

【讨论】:

  • 为什么会这样?为什么不在 httpmodule 中事件不会触发?
  • 阅读 Mitchel Sellers 的回答,这就是原因。简单的方法是使用 global.asax,但如果你不能使用它,你可以订阅你自己的模块来捕获请求。
【解决方案2】:

根据 MSDN 文档,此事件在页面完成后发生,就像 BeginRequest。因此,据我所知,在页面级别无法捕捉到这一点

【讨论】:

  • 认为调试器捕获此事件可能很棘手。但我添加了一些未被调用的代码(我确定)。
【解决方案3】:

我认为链接此事件的更好方法是为 global.asax 提供一个基类

Language="C#" Inherits="YourBaseClass"

然后重写 Init():

public override void Init()
{
    base.Init();

    BeginRequest += new EventHandler(OnBeginRequest);
    EndRequest += new EventHandler(OnEndRequest);
}

似乎对我有用(捕获断点),但我真的在用它做任何事情。

由于有多个 HttpApplication 实例,在 Page_load 中设置它可能会不断将其添加到非特定实例中。奇怪的是,我还注意到第一个 HttpApplication 实例(但 Application_start)不会调用 HttpApplication.Init()。

【讨论】:

  • 我不明白为什么会这样,但似乎是这样。如果我将 BeginRequest 分配给 Init 的处理程序,则一切正常。如果我在 Application_Start 中分配它,则永远不会调用处理程序。
【解决方案4】:

页面可能在事件触发之前被释放。您可能想尝试在 Page_Unload 处理程序中完成您的工作。

【讨论】:

  • 我们在 Request 级别需要它。我们已经有解决这个问题的方法,但我很感兴趣,实际上它并没有按照 MSDN 文档的方式工作,即:调用 CompleteRequest 方法时始终引发 EndRequest 事件。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2012-05-06
  • 2023-03-05
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多