Aperçu:
Cet article est basé sur le code source d'ASP.NET 2.0 et effectue une brève analyse du runtime ASP.NET 2.0. J'espère qu'il pourra vous aider à comprendre le processus de traitement des demandes et le modèle de compilation de pages dans ASP.NET 2.0.
Mots-clés :
Runtime ASP.NET 2.0, principes, traitement des requêtes, compilation de pages,
classes principales du Runtime HTTP ASP.NET 2.0 :
System.Web.HttpRuntime
System.Web.HttpApplicationFactory
Système.Web.HttpApplication
System.Web.Compilation.BuildManager
System.Web.Compilation.ApplicationBuildProvider
System.Web.Compilation.BuildProvidersCompiler
System.Web.UI.PageHandlerFactory
Bref organigramme du traitement des demandes :
Suggestions de lecture :
Utilisez l'outil Reflector pour afficher le code source d'ASP.NET 2.0 pendant la lecture.
analyser:
Lorsque nous lançons une requête vers une page asp.net sur le site Web ASP.NET 2.0 via le navigateur, IIS reçoit d'abord la requête côté serveur. Lorsqu'IIS voit qu'il s'agit d'une page asp.net, je suis très heureux car cela. la demande n'a pas besoin d'être traitée par celui-ci, laissez-la simplement à ASP.NET ISAPI. Le travail d'ASP.NET ISAPI est également relativement simple. Sa tâche principale est de faire en sorte que aspnet_wp.exe traite les demandes et surveille l'exécution du processus aspnet_wp.exe si le processus aspnet_wp.exe est trop fatigué et ne peut pas terminer la tâche. eh bien, ASP.NET ISAPI le licenciera et le remplacera par un nouveau aspnet_wp.exe pour gérer le travail.
La tâche principale d'aspnet_wp.exe est de transmettre les requêtes à une série d'objets gérés appelés pipelines HTTP. Si ASP.NET ISAPI est comparé à un directeur commercial, alors aspnet_wp.exe est le gestionnaire de production et le pipeline HTTP est le pipeline de production. L'équipe responsable de la chaîne d'assemblage est HttpRuntime. Le responsable de production aspnet_wp.exe transmettra la commande (requête HTTP) au membre de l'équipe HttpRuntime ProcessRequest (HttpWorkerRequest wr). HttpRuntime sera finalement produit sur la chaîne d'assemblage par ProcessRequestInternal (HttpWorkerRequest wr). ) selon la division interne du travail, ProcessRequestInternal(HttpWorkerRequest wr) est donc au centre de notre analyse.
Le travail principal de ProcessRequestInternal est :
1. Créez une instance HttpContext.
2. Initialisez la première requête (EnsureFirstRequestInit).
a) Effectuez un travail d'initialisation dans EnsureFirstRequestInit en appelant System.Web.HttpRuntime.FirstRequestInit, par exemple en lisant la configuration Web.Config dans RuntimeConfig et en chargeant tous les fichiers dll à partir du répertoire bin.
3. Créez une instance HttpWriter.
4. Créez une instance HttpApplication en appelant HttpApplicationFactory.GetApplicationInstance.
Il existe trois méthodes clés dans HttpApplicationFactory.GetApplicationInstance :
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
Analysons ces trois méthodes une par une :
1) HttpApplicationFactory._theApplicationFactory.EnsureInited();
Cette méthode vérifie si HttpApplicationFactory a été initialisé. Sinon, elle est initialisée via HttpApplicationFactory.Init().
Dans Init(), obtenez d’abord le chemin complet du fichier global.asax, puis appelez CompileApplication() pour compiler global.asax.
Comment se déroule la compilation ?
Le travail de compilation est réalisé par BuildManager. BuildManager obtient d'abord le GlobalAsaxType (c'est-à-dire HttpApplication), puis appelle BuildManager.GetGlobalAsaxBuildResult() =》GetGlobalAsaxBuildResultInternal() =》EnsureTopLevelFilesCompiled() pour la compilation.
Dans EnsureTopLevelFilesCompiled, CompilationStage.TopLevelFiles est compilé en premier, puis les fichiers des trois répertoires suivants sont compilés :
a. CompileResourcesDirectory();
Compilez le répertoire App_GlobalResources.
b. CompileWebRefDirectory();
Compilez le répertoire App_WebReferences.
c. CompileCodeDirectories();
Compilez le répertoire App_Code.
Ensuite, compilez CompilationStage.GlobalAsax, compilez global.asax et appelez la méthode : CompileGlobalAsax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp).
La compilation spécifique dans GetGlobalAsaxBuildResult est complétée par ApplicationBuildProvider et BuildProvidersCompiler.
BuildProvidersCompiler.PerformBuild(); effectue le travail de compilation.
ApplicationBuildProvider.GetBuildResult obtient le résultat compilé.
Après une compilation réussie, un fichier dll similaire à App_global.asax.mlgx7n2v.dll sera généré dans le répertoire correspondant de C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files.
La classe compilée s'appelle ASP.global_asax et hérite de HttpApplication.
Remarque : S'il n'y a pas de fichier Global.asax dans le répertoire Web, les fichiers tels que App_global.asax.mlgx7n2v.dll ne seront pas compilés et générés.
2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
Créez une instance HttpApplication spécifique, déclenchez l'événement ApplicationOnStart et exécutez la méthode Application_Start(object sender, EventArgs e) dans ASP.global_asax. L'instance HttpApplication créée ici est recyclée après le traitement de l'événement.
3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
Cette méthode crée une instance HttpApplication et l'initialise (en appelant la méthode System.Web.HttpApplication.InitInternal()).
La création d'une instance HttpApplication est basée sur le _theApplicationType réel. S'il n'y a pas de fichier global.asa dans le répertoire Web, c'est-à-dire qu'il n'y a pas de compilation dynamique pour générer le type ASP.global_asax, alors instanciez directement HttpApplication. Si le type ASP.global_asax est créé, instanciez ASP.global_asa.
Après avoir créé l'instance HttpApplication, appelez la méthode InitInternal de l'instance.
La méthode InitInternal est également la méthode sur laquelle nous nous concentrons. Les principales fonctions de cette méthode sont les suivantes :
1. InitModules() : créez les HttpModules correspondants en fonction des paramètres de Web.Config.
2. HookupEventHandlersForAppplicationAndModules : en fonction de l'événement qui se produit, appelez la fonction de traitement d'événement correspondante dans l'instance HttpApplication.
3. Créez de nombreuses instances de classes qui implémentent l'interface IExecutionStep et ajoutez-les à _execSteps de l'instance HttpApplication actuelle, puis attendez l'exécution du rappel. De là, nous pouvons voir que HttpApplication traite les requêtes de manière asynchrone et que de nombreuses tâches de traitement des requêtes sont placées dans _execStep pour attendre que le rappel soit exécuté.
Le principal travail de traitement dans _execStep est le suivant :
1) Effectuez un contrôle de sécurité sur le chemin demandé et interdisez l’accès illégal au chemin (ValidatePathExecutionStep).
2) Si UrlMappings est défini, effectuez RewritePath(UrlMappingsExecutionStep).
3) Exécuter des fonctions de traitement d'événements, telles que : BeginRequest, AuthenticateRequest, etc.
4) Obtenez le HttpHandler qui gère la requête en cours. La compilation d'exécution de la page ASP.NET est également effectuée ici. (MapHandlerExecutionStep)
Ce traitement est effectué en appelant la méthode System.Web.HttpApplication.MapHttpHandler.
Dans MapHttpHandler, obtenez d'abord le type correspondant qui implémente IHttpHandlerFactory à partir de web.config en fonction de l'adresse consultée. Pour les pages asp.net, la valeur par défaut est PageHanlderFactory. Créez ensuite une instance PageHanlderFactory, appelez GetHandlerHelper, appelez BuildManager.CreateInstanceFromVirtualPath dans GetHandlerHelper pour compiler et créer une instance de la page ASP.NET actuellement demandée (si elle a été compilée, chargez-la directement depuis le cache).
CreateInstanceFromVirtualPath transmet la tâche de compilation à CompileWebFile() après plusieurs appels de méthode. CompileWebFile obtient le BuildProvider correspondant à partir de web.config Pour les fichiers .aspx, le BuildProvider correspondant est PageBuildProvider. La façon dont PageBuildProvider compile les pages ne sera pas analysée davantage ici. Si vous êtes intéressé, vous pouvez étudier plus en détail le code source d'ASP.NET 2.0.
5) Appelez la méthode .ProcessRequest du HttpHandler correspondant pour traiter la requête (si elle est asynchrone, appelez BeginProcessReques). (Étape d'exécution du gestionnaire d'appels)
6) Écrivez le contenu de la réponse dans le filtre. (CallFilterExecutionStep)
5. Appelez BeginProcessRequest de l'instance HttpApplication pour traiter la demande de manière asynchrone.
La plupart des choses qui se produisent dans _execSteps mentionnées ci-dessus sont exécutées après que HttpRuntime appelle HttpApplication BeginProcessRequest, puis appelle ResumeSteps dans BeginProcessRequest.
Le runtime ASP.NET 2.0 est une partie très complexe, difficile à comprendre et importante d'ASP.NET 2.0. L'étude du code source du runtime ASP.NET 2.0 nous aidera à approfondir notre compréhension des principes d'ASP.NET 2.0 et nous aidera à le faire. donnez-nous Développer des applications ASP.NET 2.0 apporte beaucoup d'aide. Cet article est la première fois que j'apprends le runtime ASP.NET 2.0. Il a été écrit pour m'aider à mieux comprendre le runtime ASP.NET 2.0. Vous êtes invités à critiquer et à faire des suggestions sur le contenu de l'article.
Je pense qu'écrire des articles peut non seulement améliorer ses compétences rédactionnelles et faciliter la communication, mais aussi qu'en écrivant des articles, on peut clarifier ses propres idées, promouvoir une réflexion approfondie et approfondir sa compréhension de la technologie. Les développeurs peuvent s'éloigner du codage. . Rédiger quelques articles techniques est toujours très utile pour s'améliorer.