Descripción general:
Este artículo se basa en el código fuente de ASP.NET 2.0 y realiza un breve análisis del tiempo de ejecución de ASP.NET 2.0. Espero que pueda ayudarlo a comprender el proceso de procesamiento de solicitudes y el modelo de compilación de páginas en ASP.NET 2.0.
Palabras clave:
Tiempo de ejecución de ASP.NET 2.0, principios, procesamiento de solicitudes, compilación de páginas,
clases principales de tiempo de ejecución HTTP de ASP.NET 2.0:
Sistema.Web.HttpRuntime
Sistema.Web.HttpApplicationFactory
Aplicación System.Web.Http
System.Web.Compilation.BuildManager
System.Web.Compilation.ApplicationBuildProvider
System.Web.Compilation.BuildProvidersCompiler
System.Web.UI.PageHandlerFactory
Breve diagrama de flujo del procesamiento de solicitudes:
Sugerencias de lectura:
Utilice la herramienta Reflector para ver el código fuente de ASP.NET 2.0 mientras lee.
analizar:
Cuando iniciamos una solicitud a una página asp.net en el sitio web ASP.NET 2.0 a través del navegador, IIS primero recibe la solicitud en el lado del servidor. Cuando IIS ve que es una página asp.net, me siento muy feliz porque esto. No es necesario que la solicitud sea procesada por él, simplemente déjela en manos de ASP.NET ISAPI. El trabajo de ASP.NET ISAPI también es relativamente sencillo. Su tarea principal es organizar que aspnet_wp.exe procese las solicitudes y monitorear la ejecución del proceso aspnet_wp.exe si el proceso aspnet_wp.exe está demasiado cansado y no puede completar la tarea. bueno, ASP.NET ISAPI lo despedirá y lo reemplazará con un nuevo aspnet_wp.exe para manejar el trabajo.
La tarea principal de aspnet_wp.exe es entregar solicitudes a una serie de objetos administrados llamados canalizaciones HTTP. Si se compara ASP.NET ISAPI con un gerente de ventas, entonces aspnet_wp.exe es el gerente de producción y la canalización HTTP es la canalización de producción. El equipo responsable de la línea de ensamblaje es HttpRuntime. El gerente de producción aspnet_wp.exe entregará el pedido (solicitud HTTP) al miembro del equipo HttpRuntime ProcessRequest (HttpWorkerRequest wr eventualmente será producido en la línea de ensamblaje por ProcessRequestInternal (HttpWorkerRequest wr). ) según la división interna del trabajo, por lo que ProcessRequestInternal(HttpWorkerRequest wr) es el foco de nuestro análisis.
El trabajo principal de ProcessRequestInternal es:
1. Cree una instancia de HttpContext.
2. Inicialice la primera solicitud (EnsureFirstRequestInit).
a) Realice algún trabajo de inicialización en GuaranteeFirstRequestInit llamando a System.Web.HttpRuntime.FirstRequestInit, como leer la configuración de Web.Config en RuntimeConfig y cargar todos los archivos dll desde el directorio bin.
3. Cree una instancia de HttpWriter.
4. Cree una instancia de HttpApplication llamando a HttpApplicationFactory.GetApplicationInstance.
Hay tres métodos clave en HttpApplicationFactory.GetApplicationInstance:
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(contexto);
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(contexto)
Analicemos estos tres métodos uno por uno:
1) HttpApplicationFactory._theApplicationFactory.EnsureInited();
Este método comprueba si HttpApplicationFactory se ha inicializado. De lo contrario, se inicializa mediante HttpApplicationFactory.Init().
En Init (), primero obtenga la ruta completa del archivo global.asax y luego llame a CompileApplication () para compilar global.asax.
¿Cómo se realiza la compilación?
El trabajo de compilación lo completa BuildManager. BuildManager primero obtiene GlobalAsaxType (es decir, HttpApplication) y luego llama a BuildManager.GetGlobalAsaxBuildResult() =》GetGlobalAsaxBuildResultInternal() =》EnsureTopLevelFilesCompiled() para la compilación.
En GarantizaTopLevelFilesCompiled, CompilationStage.TopLevelFiles se compila primero y se compilan los archivos en los tres directorios siguientes:
a. CompileResourcesDirectory();
Compile el directorio App_GlobalResources.
b.CompileWebRefDirectory();
Compile el directorio App_WebReferences.
c.CompileCodeDirectorios();
Compile el directorio App_Code.
Luego compila CompilationStage.GlobalAsax, compila global.asax y llama al método: CompileGlobalAsax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp).
La compilación específica en GetGlobalAsaxBuildResult la completan ApplicationBuildProvider y BuildProvidersCompiler.
BuildProvidersCompiler.PerformBuild(); realiza el trabajo de compilación.
ApplicationBuildProvider.GetBuildResult obtiene el resultado compilado.
Después de una compilación exitosa, se generará un archivo dll similar a App_global.asax.mlgx7n2v.dll en el directorio correspondiente de C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files.
La clase compilada se denomina ASP.global_asax y hereda de HttpApplication.
Nota: Si no hay ningún archivo Global.asax en el directorio web, archivos como App_global.asax.mlgx7n2v.dll no se compilarán ni generarán.
2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(contexto);
Cree una instancia de HttpApplication específica, active el evento ApplicationOnStart y ejecute el método Application_Start (remitente del objeto, EventArgs e) en ASP.global_asax. La instancia de HttpApplication creada aquí se recicla después de procesar el evento.
3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(contexto);
Este método crea una instancia de HttpApplication y la inicializa (llamando al método System.Web.HttpApplication.InitInternal()).
La creación de una instancia de HttpApplication se basa en el _theApplicationType real. Si no hay un archivo global.asa en el directorio web, es decir, no hay una compilación dinámica para generar el tipo ASP.global_asax, entonces cree una instancia de HttpApplication directamente. Si se crea el tipo ASP.global_asax, cree una instancia de ASP.global_asa.
Después de crear la instancia de HttpApplication, llame al método InitInternal de la instancia.
El método InitInternal es también el método en el que nos centramos. Las funciones principales de este método son las siguientes:
1. InitModules (): cree los HttpModules correspondientes de acuerdo con la configuración de Web.Config.
2. HookupEventHandlersForAppplicationAndModules: según el evento que ocurre, llame a la función de procesamiento de eventos correspondiente en la instancia de HttpApplication.
3. Cree muchas instancias de clases que implementen la interfaz IExecutionStep y agréguelas a _execSteps de la instancia HttpApplication actual y espere la ejecución de la devolución de llamada. Desde aquí podemos ver que HttpApplication procesa las solicitudes de forma asincrónica y muchas tareas de procesamiento de solicitudes se colocan en _execStep para esperar a que se ejecute la devolución de llamada.
El trabajo de procesamiento principal en _execStep es el siguiente:
1) Realizar una verificación de seguridad en la ruta solicitada y prohibir el acceso ilegal a la ruta (ValidatePathExecutionStep).
2) Si se configura UrlMappings, realice RewritePath (UrlMappingsExecutionStep).
3) Ejecutar funciones de procesamiento de eventos, como: BeginRequest, AuthenticateRequest, etc.
4) Obtenga el HttpHandler que maneja la solicitud actual. Aquí también se realiza la compilación en tiempo de ejecución de la página ASP.NET. (Paso de ejecución de MapHandler)
Este procesamiento se realiza llamando al método System.Web.HttpApplication.MapHttpHandler.
En MapHttpHandler, primero obtenga el tipo correspondiente que implementa IHttpHandlerFactory de web.config según la dirección a la que se accede. Para las páginas asp.net, el valor predeterminado es PageHanlderFactory. Luego cree una instancia de PageHanlderFactory, llame a GetHandlerHelper, llame a BuildManager.CreateInstanceFromVirtualPath en GetHandlerHelper para compilar y crear una instancia de la página ASP.NET solicitada actualmente (si se ha compilado, cárguela directamente desde el caché).
CreateInstanceFromVirtualPath pasa la tarea de compilación a BuildManager () después de varias llamadas al método. CompileWebFile obtiene el BuildProvider correspondiente de web.config. Para archivos .aspx, el BuildProvider correspondiente es PageBuildProvider. Aquí no se analizará más a fondo cómo PageBuildProvider compila las páginas. Si está interesado, puede estudiar más a fondo el código fuente de ASP.NET 2.0.
5) Llame al método .ProcessRequest del HttpHandler correspondiente para procesar la solicitud (si es asíncrono, llame a BeginProcessReques). (Paso de ejecución de CallHandler)
6) Escriba el contenido de la respuesta en Filtro. (CallFilterExecutionStep)
5. Llame a BeginProcessRequest de la instancia de HttpApplication para procesar la solicitud de forma asíncrona.
Muchas de las cosas que suceden en _execSteps mencionadas anteriormente se ejecutan después de que HttpRuntime llama a HttpApplication BeginProcessRequest y luego llama a ResumeSteps en BeginProcessRequest.
El tiempo de ejecución de ASP.NET 2.0 es una parte muy compleja, difícil de entender e importante de ASP.NET 2.0. El estudio del código fuente del tiempo de ejecución de ASP.NET 2.0 nos ayudará a profundizar nuestra comprensión de los principios de ASP.NET 2.0. Danos El desarrollo de aplicaciones ASP.NET 2.0 nos brinda mucha ayuda. Este artículo es la primera vez que aprendo el tiempo de ejecución de ASP.NET 2.0. Fue escrito para ayudarme a comprender mejor el tiempo de ejecución de ASP.NET 2.0. Puede criticar y hacer sugerencias sobre el contenido del artículo.
Siento que escribir artículos no solo puede mejorar las habilidades de escritura y facilitar la comunicación, sino que también a través de la redacción de artículos se pueden aclarar las propias ideas, promover el pensamiento profundo y profundizar la comprensión de la tecnología. Los desarrolladores pueden tomarse un tiempo para dedicarse a la codificación. Escribir algunos artículos técnicos sigue siendo muy útil para mejorar.