Global.asax - Application_BeginRequest 与句柄 Me.BeginRequest
Global.asax - Application_BeginRequest vs Handles Me.BeginRequest
似乎有 2 种不同的方法可以在 BeginRequest 上执行 Global.asax.vb 中的代码,我不确定应该在哪里使用其中一种。
我可以像这样定义一个子...
Sub Application_BeginRequest(sender As Object, e As EventArgs)
或者像这样定义一个事件处理程序...
Private Sub Global_asax_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
我一直在不同的网站上交替使用这些方法,但现在我很好奇一种方法是否比另一种更正确,或者是否存在不同的情况,每种方法可能更可取。
如果我同时定义两者,我注意到两者都 运行,但事件处理程序 运行 首先。
两者都表示服务于相同目的的事件处理程序方法,不同之处在于 Application_BeginRequest
已由 ASP.NET 自动设置
另一个 Global_asax_BeginRequest
已在您的代码中明确注册。
参见MSDN:
ASP.NET automatically binds application events to event-handler methods in the Global.asax file using a naming convention of Application_event, such as Application_BeginRequest and Application_Error.
实际上Application_BeginRequest
是Sub Application_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
的快捷方式。
您的自定义事件处理程序 Global_asax_BeginRequest
运行 首先是因为在编译时通过 Handles
关键字进行的事件订阅最终在 Global_asax
class,让它有机会先注册到这个事件,然后 Application_BeginRequest
才能被钩住。
当引发 BeginRequest
事件时,注册顺序很重要并得到尊重。
如果您使用 eg 反编译构建程序集,这一点就会变得很清楚。 ILSply 到 C#,如下图所示。注意构造函数中自动生成的事件订阅。
如果您希望自定义事件处理程序在 Application_BeginRequest
之后 运行,您必须通过 AddHandler
.[=27 在 Init
方法中进行手动订阅=]
下面的代码显示了 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
似乎有 2 种不同的方法可以在 BeginRequest 上执行 Global.asax.vb 中的代码,我不确定应该在哪里使用其中一种。
我可以像这样定义一个子...
Sub Application_BeginRequest(sender As Object, e As EventArgs)
或者像这样定义一个事件处理程序...
Private Sub Global_asax_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
我一直在不同的网站上交替使用这些方法,但现在我很好奇一种方法是否比另一种更正确,或者是否存在不同的情况,每种方法可能更可取。
如果我同时定义两者,我注意到两者都 运行,但事件处理程序 运行 首先。
两者都表示服务于相同目的的事件处理程序方法,不同之处在于 Application_BeginRequest
已由 ASP.NET 自动设置
另一个 Global_asax_BeginRequest
已在您的代码中明确注册。
参见MSDN:
ASP.NET automatically binds application events to event-handler methods in the Global.asax file using a naming convention of Application_event, such as Application_BeginRequest and Application_Error.
实际上Application_BeginRequest
是Sub Application_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest
的快捷方式。
您的自定义事件处理程序 Global_asax_BeginRequest
运行 首先是因为在编译时通过 Handles
关键字进行的事件订阅最终在 Global_asax
class,让它有机会先注册到这个事件,然后 Application_BeginRequest
才能被钩住。
当引发 BeginRequest
事件时,注册顺序很重要并得到尊重。
如果您使用 eg 反编译构建程序集,这一点就会变得很清楚。 ILSply 到 C#,如下图所示。注意构造函数中自动生成的事件订阅。
如果您希望自定义事件处理程序在 Application_BeginRequest
之后 运行,您必须通过 AddHandler
.[=27 在 Init
方法中进行手动订阅=]
下面的代码显示了 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