订阅Application_BeginRequest

时间:2012-04-03 07:37:58

标签: asp.net

有没有办法从Global.asax订阅HttpApplication的BeginRequest事件?

我想要做的是向Global.asax的Application_Start方法添加一行代码,然后我将订阅一个对象,包括BeginRequest和EndRequest方法。

我知道这可以通过HttpModules完成,但由于各种原因我无法使用HttpModules。

目的是能够将同一行代码添加到多个网站的global.asax页面。

3 个答案:

答案 0 :(得分:3)

我已经做了一些挖掘,并且发现了Init方法是我的选择。我不相信Global.asax构造函数或Application_Start方法是可行的。根据MS文档:

  

您应该在应用程序启动期间仅设置静态数据。不要设置任何实例数据,因为它只能用于创建的HttpApplication类的第一个实例。

我将其解释为:“不要在此处注册事件,因为在第一次请求后它将无法使用。”

  

在创建所有模块后,对每个HttpApplication类实例调用一次Init方法。

我将其解释为:“在此处注册您的事件,因为它将针对应用程序的每个新实例进行注册,并且不会删除处理程序”。

这里的关键是“在创建所有模块之后”。在此之前调用构造函数,因此不是正确的位置。对于Application_Start,我已经尝试了很多次,但是我不能让事件注册坚持下去 - 这是由文档证明的。

所以我尝试将代码添加到Init方法,它工作得很好 即。

public void Init()
{
    this.BeginRequest += attach your handler here;
    this.EndRequest += attach your other handler here;
}

答案 1 :(得分:2)

我有

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Put your code here
End Sub

在Global.asax.vb(Class [Global])中,它有效。

但是,您需要调用其他类的方法。要实现此目的,必须为BeginRequest' in全局新建。{/ p>添加处理程序

示例:

班级:

Public Class MyHandlers
  Public Shared Sub MyCode(sender As Object, e As System.EventArgs)
    HttpContext.Current.Response.Write(HttpContext.Current.Request.Path)
  End Sub

 End Class

Global.asax.vb:

Public Class Global_asax
   Inherits System.Web.HttpApplication

   Public Sub New()
     MyBase.New()
     AddHandler Me.BeginRequest, AddressOf MyHandlers.MyCode
   End Sub

 Rem ....

 End Class

答案 2 :(得分:0)

 public void Application_Start( object sender, EventArgs e )
 {
     HttpApplication app = (HttpApplication)sender;

     app.BeginRequest += attach your handler here;
     app.EndRequest += attach your other handler here;
 }