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_BeginRequestSub 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