Global.asax-Application_BeginRequest与处理Me.BeginRequest

时间:2018-11-07 05:13:21

标签: asp.net vb.net asp.net-mvc-5 global-asax

在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

我一直在不同的地方交替使用这些方法,但是现在我很好奇一个方法是否比另一个方法更正确,或者是否有不同的情况可能更合适。

如果我同时定义了两者,则我注意到它们都运行了,但是事件处理程序先运行了。

1 个答案:

答案 0 :(得分:1)

两者都表示具有相同目的的事件处理程序方法,不同之处在于Application_BeginRequest已由ASP.NET自动设置 另一个Global_asax_BeginRequest已在您的代码中显式注册。

请参见MSDN

  

ASP.NET使用Application_event的命名约定,例如Application_BeginRequest和Application_Error,将应用程序事件自动绑定到Global.asax文件中的事件处理程序方法。

实际上Application_BeginRequestSub Application_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest的快捷方式。

您的自定义事件处理程序Global_asax_BeginRequest首先运行,因为在编译时,通过Handles关键字进行的事件订阅最终在Global_asax类的构造函数中,从而有机会注册可以钩住Application_BeginRequest之前,先对此事件进行处理。 当BeginRequest事件引发时,注册顺序很重要并得到尊重。

如果使用例如来反编译build程序集,这将变得很清楚。 ILSply转换为C#,如下图所示。注意构造器中自动生成的事件订阅。

enter image description here

如果您希望自定义事件处理程序在Application_BeginRequest之后运行,则必须通过InitAddHandler方法中进行手动订阅。

下面的代码显示了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