web-dev-qa-db-fra.com

comment câbler Application_BeginRequest () dans asp.net-mvc

je vois dans global.aspx.cs d'un projet asp.net-mvc

 protected void Application_BeginRequest()
 {
 }

mais quand j'essaye d'ajouter ceci à mon projet, je ne vois pas comment appelle cette méthode. Je vois que la base System.Web.HttpApplication a cet événement, mais je ne vois rien le remplacer ou s'abonner à cet événement.

Quelqu'un peut-il expliquer comment vous connectez Application_BeginRequest dans asp.net-mvc?

43
leora

J'ai bien peur que la réponse de Cos ne soit pas tout à fait exacte. Vous n'avez pas besoin de le câbler car la classe de base HttpApplication le fait pour vous. Il n'y a pas d'interface ni de substitution ici; HttpApplication utilise la réflexion pour connecter ces méthodes aux événements en fonction du nom de la méthode. C'est donc un peu de magie basée sur les conventions qui est dans le cadre depuis un certain temps. C'est très étrange, et je pense qu'ils ne l'ont fait que pour conserver des similitudes avec Classic ASP dans la journée et/ou fournir un raccourci pour éviter d'écrire beaucoup de petits HttpModules.

Pour les curieux, chargez HttpApplication dans Reflector et recherchez la méthode HookupEventHandlersForApplicationAndModules(). Ou, chargez HttpApplicationFactory et regardez les méthodes ReflectOnApplicationType() et ReflectOnMethodInfoIfItLooksLikeEventHandler() (love that name!).

Rick Strahl en a discuté sur son blog il y a quelques années.

Est-ce quelque chose que vous devez vraiment savoir pour utiliser ASP.NET? Non, mais le savoir enlève certainement une partie du mystère.

110
Nicholas Piasecki

Toute application ASP.NET est un objet (ou classe) de type:

public class Global : System.Web.HttpApplication ( vous le trouverez dans le fichier global.asax )

Le moteur ASP.NET invoqué par IIS crée une instance de votre objet et l'interface HttpApplication demande Application_BeginRequest, qui est invoquée par IIS (via l'ISAPI) )

Lorsque le moteur ASP.NET crée une instance de votre classe, cela ressemble à ceci:

HttpApplication thisAspApp = new YourASPApplication()
thisApplication.Begin_Request()

Parce qu'il convertit votre application en type dérivé, l'interface connue est directement accessible sans besoin de remplacement. Bien que HttpApplication soit une classe, elle est utilisée comme interface par le biais de la conversion. Si vous ajoutez une nouvelle méthode (ou propriété) à votre classe, le moteur ASP.NET ne peut pas accéder à cette méthode car il ne connaît que votre application en tant que HttpApplication générique. Dans VS, si vous accédez à global.asax et cliquez avec le bouton droit sur HttpApplication dans la déclaration de classe et sélectionnez "Aller à la définition" (ou appuyez sur F12), vous pouvez voir la structure de la classe de base. (ou vous pouvez le trouver dans MSDN en ligne).

3
Cos Callis