有没有办法从Global.asax订阅HttpApplication的BeginRequest事件?
我想要做的是向Global.asax的Application_Start方法添加一行代码,然后我将订阅一个对象,包括BeginRequest和EndRequest方法。
我知道这可以通过HttpModules完成,但由于各种原因我无法使用HttpModules。
目的是能够将同一行代码添加到多个网站的global.asax页面。
答案 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;
}