Avancé: Combien de fois ne HttpModule méthode Init() appelée lors de l'application de la vie?
Web d'initialisation de l'application est comme suit:
- Comme nous le savons, quand IIS reçoit la première demande d'un particulier Asp.net demande de ressources, IIS crée une instance d'un
HttpApplication
(défini dansglobal.asax
code-behind). - Lors de cette nouvelle instance est créée, c'est l'initialisation arrive que des vérifications de tous configurés HTTP modules.
- Tous les modules sont ensuite instancié et de mettre en application
Modules
collection (de typeHttpModuleCollection
) - modules sont bouclés et leurs
Init()
méthode est appelée (lorsqu'ils s'inscrivent à la demande événements)
Pour autant que je comprends le scénario ci-dessus se produit lorsqu'une application web est démarré/initialisé (par conséquent, l'application de début de l'événement).
Ce qui se passe avec les modules?
Sont-ils (re)instatiated sur chaque demande ou réutilisée de la Modules
propriété sur chaque consécutives demande, alors que l'application web est vivant? Comme je comprends IIS et Asp.net ils sont réutilisés par le biais de l'ensemble de la durée de vie d'une application web.
S'ils sont réutilisés, peut-on supposer que leur Init()
méthode est en fait un pseudo gestionnaire d'événement pour l'application de début de l'événement? Le truc, c'est que nous ne pouvez pas joindre à la demande les événements de niveau dans les modules http. Mais si elles sont réutilisées nous pourrions utiliser Init()
que l'application de début de l'événement et de faire tout ce que nous avions mis en global.asax
à la place.
Question
Peut-on supposer que le module Init()
méthode est appelée seulement sur l'application de début de l'événement? Pourrions-nous utiliser cette hypothèse c'est à dire enregistrer des itinéraires pour les applications dont les global.asax
codebehind nous ne pouvons pas changer? web.config
est généralement accessible et nous pouvons changer la façon dont nous voulons.
Serait-ce fonctionne réellement?
Informations supplémentaires
Nous pouvons vérifier HttpApplication
code et vérifier sa InitModulesCommon()
méthode. Ce seul fait les appels Init()
de chaque enregistré HTTP module. Ce qui est plus intéressant est que cette méthode est utilisée uniquement par InitIntegratedModules()
et InitModules()
méthodes. Qui sont tous deux utilisés seulement dans HttpApplication.InitInternal()
méthode. C'est la base de mes hypothèses, mais je voudrais savoir si quelqu'un a abusé de IHttpModule.Init()
pour l'application de début de l'événement.
Vous devez vous connecter pour publier un commentaire.
Init()
est appelée qu'une seule fois (parHttpApplication
exemple)Après j'ai testé le fonctionnement interne de
IHttpModule
d'initialisation sont comme suit:IHttpModule
est initialisé au démarrage de l'application web par instatiating et un appel àInit()
méthodeHttpApplication
stocke toutes les module cas, dans sesModules
propriétéHttpApplication
et ne sont pas défaussées/réinitialisé tant que l'application est vivantDe sorte que le meilleur résultat est
Vous ne pouvez pas joindre un
IHttpModule
à niveau de l'application des événements, mais vous pouvez utiliser sesInit()
méthode du pseudo-démarrage de l'application délégué d'événement. A l'intérieur vous pouvez exécuter le code que tu avais l'habitude de mettre à l'intérieur deApplication_Start
délégué dans votreGlobal.asax
.Vous pouvez également lire des informations détaillées à ce sujet dans mon post de blog.
Mais être prudent dans la vie réelle environnement de serveur web
Mais IIS utilise ce qu'on appelle pools d'applications. Et chaque groupe peut avoir un nombre arbitraire de
HttpApplication
instances. Oui plusieurs. Départ d'Application crée toutes ces instances. Chacun d'entre eux initialise leur propre liste de modules, mais seul le premier exécute laApplication_OnStart
gestionnaire d'événement.Donc à chaque fois que votre module modifie certaines communes ressource partagée, vous devez prendre des mesures supplémentaires pour indiquer que le premier module a fait et autres de ne pas le faire à nouveau. Lire un supplémentaire post de blog sujet qui va vous montrer comment et quand utiliser filetage de verrouillage avec votre module pour le rendre réellement agir comme un
Application_OnStart
gestionnaire d'événement. BTW: Il est également possible de gérerApplication_OnEnd
événement si vous en avez besoin. 😉Détaillée blog de poster des liens
Init
est appelée une seule fois par chaqueHttpApplication
instance. Quand on lit à travers l'ensemble de la réponse (comme ils le devraient), alors qu'ils comprennent comment l'approche de leur propre problème.Application_Start est exécuté qu'une seule fois pour la durée de vie de votre application.
IHttpModule.Init est exécuté pour chaque instance de HttpApplication, avant le traitement de la demande commence. Voir la procédure pas à pas. Init est où vous pouvez enregistrer des événements utilisés pour traiter la demande.
Une instance de HttpApplication peuvent être réutilisés pour de multiples demandes. ASP.Net piscines HttpApplication objets, de sorte que l'Init sera appelée une fois pour chaque nouvelle instance de HttpApplication
Init()
est appelée. Et basé surHttpApplication
le code que j'ai examiné, il ne semble pas que les modules pourrait être réintroduit pour chaque demande. C'est un exemple très simple d'un module que vous avez à condition de ne pas donner tout de perspicacité dans l'exécution du pipeline.Init()
méthode deHttpModule
peut être pensé à un démarrage de l'application évènement. Juste comme je m'y attendais. Je ne pense pas que les développeurs de réaliser effectivement que les ou penser à quand le développement d'applications. Il est encore impossible à obtenir pour les événements de Session dansHttpModule
.Application_OnStart
. Mais qui peut aussi bien être fait par un module. Vous devez l'utiliser à chaque fois que votre module modifie commune de la ressource partagée. Lire tous les détails dans mon blog. erraticdev.blogspot.com/2011/01/...