Global.asax - Application_BeginRequest vs Handles Me.BeginRequest - PullRequest
0 голосов
/ 07 ноября 2018

Похоже, есть 2 разных способа выполнения кода в Global.asax.vb в BeginRequest, и я не уверен, где мне следует использовать один поверх другого.

Я могу определить саб так, как ...

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 голосов
/ 09 ноября 2018

Оба представляют методы-обработчики событий, которые служат одной и той же цели, с той разницей, что ASP.NET автоматически установил Application_BeginRequest. а другой Global_asax_BeginRequest был явно зарегистрирован в вашем коде.

См. MSDN :

ASP.NET автоматически связывает события приложения с методами-обработчиками в файле Global.asax, используя соглашение об именах Application_event, такое как Application_BeginRequest и Application_Error.

На самом деле Application_BeginRequest является сокращением для Sub Application_BeginRequest(sender As Object, e As EventArgs) Handles Me.BeginRequest.

Ваш пользовательский обработчик событий Global_asax_BeginRequest запускается первым, потому что во время компиляции подписка на событие, созданная с помощью ключевого слова Handles, заканчивается в конструкторе класса Global_asax, что дает ему возможность сначала зарегистрироваться на это событие, прежде чем Application_BeginRequest можно зацепить. Когда возникает событие BeginRequest, порядок регистрации имеет значение и соблюдается.

Это становится понятным, если вы декомпилируете сборку сборки, например, с помощью. ILSply к C #, как показано на рисунке ниже. Обратите внимание на автоматически сгенерированную подписку на события в конструкторе.

enter image description here

Если вы хотите, чтобы ваш пользовательский обработчик событий запускался после 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
...