在BeginRequest上的Global.asax.vb中似乎有2种不同的方式来执行代码,我不确定应该在哪里使用另一种方式。
我可以这样定义一个子项...
Sub Application_BeginRequest(sender As Object, e As EventArgs)
或像这样定义事件处理程序...
Private Sub Global_asax_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
我一直在不同的地方交替使用这些方法,但是现在我很好奇一个方法是否比另一个方法更正确,或者是否有不同的情况可能更合适。
如果我同时定义了两者,则我注意到它们都运行了,但是事件处理程序先运行了。
答案 0 :(得分:1)
两者都表示具有相同目的的事件处理程序方法,不同之处在于Application_BeginRequest
已由ASP.NET自动设置
另一个Global_asax_BeginRequest
已在您的代码中显式注册。
请参见MSDN:
ASP.NET使用Application_event的命名约定,例如Application_BeginRequest和Application_Error,将应用程序事件自动绑定到Global.asax文件中的事件处理程序方法。
实际上Application_BeginRequest
是Sub Application_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
的快捷方式。
您的自定义事件处理程序Global_asax_BeginRequest
首先运行,因为在编译时,通过Handles
关键字进行的事件订阅最终在Global_asax
类的构造函数中,从而有机会注册可以钩住Application_BeginRequest
之前,先对此事件进行处理。
当BeginRequest
事件引发时,注册顺序很重要并得到尊重。
如果使用例如来反编译build程序集,这将变得很清楚。 ILSply转换为C#,如下图所示。注意构造器中自动生成的事件订阅。
如果您希望自定义事件处理程序在Application_BeginRequest
之后运行,则必须通过Init
在AddHandler
方法中进行手动订阅。
下面的代码显示了BeginRequest
的不同事件订阅以及执行顺序。
Public Class Global_asax
Inherits HttpApplication
Public Overrides Sub Init()
AddHandler Me.BeginRequest, AddressOf handleBeginRequest
End Sub
Sub Application_BeginRequest(sender As Object, e As EventArgs)
'Runs second.
End Sub
Private Sub Global_asax_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
'Runs first.
End Sub
Private Sub handleBeginRequest(sender As Object, e As EventArgs)
'Runs third.
End Sub
End Class