Asp.net 订阅应用程序_BeginRequest

Asp.net 订阅应用程序_BeginRequest,asp.net,Asp.net,有没有办法从Global.asax订阅HttpApplication的BeginRequest事件 我想做的是在Global.asax的Application_Start方法中添加一行代码,然后它会将我拥有的对象订阅到BeginRequest和EndRequest方法 我知道这可以通过HttpModules来实现,但是我不能使用HttpModules,原因很多,我将不详细介绍 其目的是能够将同一行代码添加到多个网站的global.asax页面。我有 Sub Application_BeginRe

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

我想做的是在Global.asax的Application_Start方法中添加一行代码,然后它会将我拥有的对象订阅到BeginRequest和EndRequest方法

我知道这可以通过HttpModules来实现,但是我不能使用HttpModules,原因很多,我将不详细介绍

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

我有

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Put your code here
End Sub
在Global.asax.vb(
Class[Global]
)中,它可以工作

但是,您需要调用其他类的方法。要实现这一点,必须在Global
New`中为
BeginRequest'添加处理程序

例如:

班级:

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

我做了更多的挖掘,发现Init方法是适合我的方法。我不相信Global.asax构造函数或Application\u Start方法是可行的。根据MS文档:

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

我将其解释为:“不要在这里注册事件,因为它在第一次请求后将不可用。”

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

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

这里的关键是“创建所有模块后”。构造函数在此之前被调用,因此不是正确的位置。至于Application_Start,我已经尝试了很多次,但是我无法让事件注册保持不变,这一点已经被文档证明了

因此,我尝试将代码添加到Init方法中,效果很好 i、 e


我将代码放在您建议的位置,但由于某些原因,我的事件从未被触发。我创建了新的ASP.NET应用程序项目(visual basic),打开了Global.asax.vb,找到了
子应用程序\u BeginRequest
,在其中放置了一个断点并运行。断点已命中。你能试试吗?应用程序启动了,这不是问题所在。问题是,在调用应用程序_BeginRequest时,如果不将代码放在另一个类中,我就无法从另一个类中激发代码。关键是我不想将代码复制到应用程序中,因为我已经修改了我的响应。我希望现在它就是您所需要的。好的,您正在向Global.asax的构造函数添加代码。我不知道这样做意味着什么,但它似乎会起作用。谢谢你,我也试过了,但是如上所述,我的代码没有被执行。我需要做更多的挖掘,但是我有一个类,它带有一个Init方法,该方法将HttpApplication作为一个参数。在Init方法中,它执行:>BeginRequest+=和>EndRequest+=代码模块),该模块重定向到类中的方法。当我在Global.asax的应用程序_Start中创建该类的新实例并调用Init时,它进行了连接,但我认为连接不成功,因为从未调用过委托。伊万有一个答案,但我不相信把东西放在Gloal.asax里是安全的…对我来说也是一样的经历。该方法未被执行。在您的Init函数中,
sender
变量来自何处?@billy,我修复了帖子,我一定犯了一些或其他复制粘贴错误
 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;
 }
public void Init()
{
    this.BeginRequest += attach your handler here;
    this.EndRequest += attach your other handler here;
}