|
J’ai constaté que beaucoup d’amis, comme moi, utilisaient par erreur IHttpModule.Init comme une alternative Application_Start pour effectuer certaines opérations d’initialisation d’application à son dedans. Cependant, la nature des événements Application_Start dans IHttpModule.Init et Global.asax est différente, et IHttpModule.Init ne peut pas être utilisé directement pour remplacer Application_Start ASP.NET processus d’initialisation de l’application. Il ne peut pas non plus simplement conclure que la méthode Init est appelée à plusieurs reprises pour conclure que ASP.NET programme a été redémarré. La raison en est qu’IHttpModule.Init peut être appelé plusieurs fois lorsqu’il répond à une requête ASP.NET, et cela se produit très probablement lors de l’exploitation réelle du site web. Pourquoi IHttpModule.Init est-il appelé plusieurs fois parce que chaque instance HttpApplication ne peut gérer qu’une seule requête à la fois, et ASP.NET supporte un certain nombre de requêtes concurrentes, donc l’instance HttpApplication sera créée plusieurs fois pour répondre à différentes requêtes lorsqu’il ne suffit pas de répondre à des requêtes concurrentes. Chaque instance HttpApplication crée un nouvel ensemble de modules Http et appelle la méthode Init après sa création. Application_Start ne sera appelé qu’après la création du premier objet HttpApplication, et les instances HttpApplication suivantes ne déclencheront pas cet événement. Je pense que la réutilisation des instances HttpApplication est une raison majeure de la mauvaise compréhension de l’utilisation de la méthode Init d’IHttpModule, car nous n’avons généralement qu’une seule requête lors du débogage d’un programme, et il est pratiquement impossible d’exécuter à plusieurs reprises la méthode Init d’HttpModule. Dans l’environnement de fonctionnement du site web réel, les requêtes concurrentes sont courantes, et si la méthode Init est mal utilisée, cela peut entraîner des problèmes étranges dans l’environnement réel. Pour plus de détails, veuillez consulter le « Aperçu du cycle de vie des applications ASP.NET pour IIS 5.0 et 6.0 » de MSDN, qui fournit des images dans l’article : Vous pouvez également utiliser Refelector pour décompiler l’assembleur System.Web et analyser la relation d’appel de la méthode IHttpModule.Init. Vous obtiendrez la méthode System.Web.HttpApplicationFactory.GetNormalApplicationInstance, qui montre comment les instances d’HttpApplication sont réutilisées et créées. En résumé, IHttpModule.Init ne peut pas simplement être utilisé comme un substitut de Application_Start. Une méthode relativement simple consiste à utiliser un champ de type bool statique comme balise d’initialisation, et à définir la marque sur true après l’initialisation requise par le programme dans HttpModule, sans répéter l’initialisation la prochaine fois. Cependant, du code comme l’enregistrement de l’événement BeginRequest doit toujours être exécuté à chaque exécution d’Init, car l’instance HttpModule à ce moment est différente ; si vous jugez le champ de balisage statique d’initialisation sans répéter l’événement d’enregistrement, cela entraînera des problèmes étranges comme la réécriture d’URL parfois exécutée, parfois non.
[Mythe] La méthode Init de l’objet HttpApplication ne sera-t-elle exécutée qu’une seule fois ?
Réponse : Il sera exécuté plusieurs fois !!!!
|