Visão geral:
Este artigo é baseado no código-fonte do ASP.NET 2.0 e conduz uma breve análise do tempo de execução do ASP.NET 2.0. Espero que possa ajudá-lo a entender o processo de processamento de solicitações e o modelo de compilação de páginas no ASP.NET 2.0.
Palavras-chave:
Tempo de execução do ASP.NET 2.0, princípios, processamento de solicitações, compilação de páginas,
classes principais do tempo de execução HTTP do ASP.NET 2.0:
System.Web.HttpRuntime
System.Web.HttpApplicationFactory
System.Web.HttpApplication
System.Web.Compilation.BuildManager
System.Web.Compilation.ApplicationBuildProvider
System.Web.Compilation.BuildProvidersCompiler
System.Web.UI.PageHandlerFactory
Breve fluxograma de processamento de solicitações:
Sugestões de leitura:
Use a ferramenta Reflector para visualizar o código-fonte do ASP.NET 2.0 durante a leitura.
analisar:
Quando iniciamos uma solicitação para uma página asp.net no site ASP.NET 2.0 por meio do navegador, o IIS primeiro recebe a solicitação no lado do servidor. Quando o IIS vê que é uma página asp.net, fico muito feliz porque isso. a solicitação não precisa ser processada por ele, basta deixá-la para o ASP.NET ISAPI. O trabalho do ASP.NET ISAPI também é relativamente fácil. Sua principal tarefa é fazer com que o aspnet_wp.exe processe solicitações e monitore a execução do processo aspnet_wp.exe se o processo aspnet_wp.exe estiver muito cansado e não puder concluir a tarefa. bem, o ASP.NET ISAPI irá dispensá-lo e substituí-lo por um novo aspnet_wp.exe para lidar com o trabalho.
A principal tarefa do aspnet_wp.exe é entregar solicitações a uma série de objetos gerenciados chamados pipelines HTTP. Se o ASP.NET ISAPI for comparado a um gerente de vendas, então aspnet_wp.exe será o gerenciador de produção e o pipeline HTTP será o pipeline de produção. A equipe responsável pela linha de montagem é HttpRuntime. O gerente de produção aspnet_wp.exe entregará o pedido (solicitação HTTP) ao membro da equipe HttpRuntime ProcessRequest (HttpWorkerRequest wr será eventualmente produzido na linha de montagem por ProcessRequestInternal (HttpWorkerRequest wr). ) de acordo com a divisão interna do trabalho, então ProcessRequestInternal(HttpWorkerRequest wr) é o foco de nossa análise.
O principal trabalho do ProcessRequestInternal é:
1. Crie uma instância HttpContext.
2. Inicialize a primeira solicitação (EnsureFirstRequestInit).
a) Execute algum trabalho de inicialização em GarantaFirstRequestInit chamando System.Web.HttpRuntime.FirstRequestInit, como ler a configuração Web.Config em RuntimeConfig e carregar todos os arquivos dll do diretório bin.
3. Crie uma instância HttpWriter.
4. Crie uma instância HttpApplication chamando HttpApplicationFactory.GetApplicationInstance.
Existem três métodos principais em HttpApplicationFactory.GetApplicationInstance:
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(contexto);
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
Vamos analisar esses três métodos um por um:
1) HttpApplicationFactory._theApplicationFactory.EnsureInited();
Este método verifica se HttpApplicationFactory foi inicializado. Caso contrário, ele é inicializado por meio de HttpApplicationFactory.Init().
Em Init(), primeiro obtenha o caminho completo do arquivo global.asax e, em seguida, chame CompileApplication() para compilar global.asax.
Como é realizada a compilação?
O trabalho de compilação é concluído pelo BuildManager. O BuildManager primeiro obtém o GlobalAsaxType (ou seja, HttpApplication) e depois chama BuildManager.GetGlobalAsaxBuildResult() =》GetGlobalAsaxBuildResultInternal() =》EnsureTopLevelFilesCompiled() para compilação.
Em GaranteTopLevelFilesCompiled, CompilationStage.TopLevelFiles é compilado primeiro e os arquivos nos três diretórios a seguir são compilados:
a. CompileResourcesDirectory();
Compile o diretório App_GlobalResources.
b.CompileWebRefDirectory();
Compile o diretório App_WebReferences.
c.CompileCodeDirectories();
Compile o diretório App_Code.
Em seguida, compile CompilationStage.GlobalAsax, compile global.asax e chame o método: CompileGlobalAsax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp).
A compilação específica em GetGlobalAsaxBuildResult é concluída por ApplicationBuildProvider e BuildProvidersCompiler.
BuildProvidersCompiler.PerformBuild(); executa trabalho de compilação.
ApplicationBuildProvider.GetBuildResult obtém o resultado compilado.
Após a compilação bem-sucedida, um arquivo dll semelhante a App_global.asax.mlgx7n2v.dll será gerado no diretório correspondente de C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files.
A classe compilada é denominada ASP.global_asax e herda de HttpApplication.
Nota: Se não houver nenhum arquivo Global.asax no diretório da Web, arquivos como App_global.asax.mlgx7n2v.dll não serão compilados e gerados.
2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(contexto);
Crie uma instância HttpApplication específica, acione o evento ApplicationOnStart e execute o método Application_Start(object sender, EventArgs e) em ASP.global_asax. A instância HttpApplication criada aqui é reciclada após o processamento do evento.
3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(contexto);
Este método cria uma instância HttpApplication e a inicializa (chamando o método System.Web.HttpApplication.InitInternal()).
A criação de uma instância HttpApplication é baseada no _theApplicationType real. Se não houver arquivo global.asa no diretório da Web, ou seja, não houver compilação dinâmica para gerar o tipo ASP.global_asax, instancie HttpApplication diretamente. Se o tipo ASP.global_asax for criado, instancie ASP.global_asa.
Depois de criar a instância HttpApplication, chame o método InitInternal da instância.
O método InitInternal também é o método em que nos concentramos. As principais funções deste método são as seguintes:
1. InitModules(): Crie HttpModules correspondentes de acordo com as configurações do Web.Config.
2. HookupEventHandlersForAppplicationAndModules: Com base no evento que ocorre, chame a função de processamento de evento correspondente na instância HttpApplication.
3. Crie muitas instâncias de classes que implementam a interface IExecutionStep e adicione-as a _execSteps da instância HttpApplication atual e aguarde a execução do retorno de chamada. A partir daqui, podemos ver que HttpApplication processa solicitações de maneira assíncrona e muitas tarefas de processamento de solicitações são colocadas em _execStep para aguardar a execução do retorno de chamada.
O principal trabalho de processamento em _execStep é o seguinte:
1) Execute uma verificação de segurança no caminho solicitado e proíba o acesso ilegal ao caminho (ValidatePathExecutionStep).
2) Se UrlMappings estiver definido, execute RewritePath(UrlMappingsExecutionStep).
3) Execute funções de processamento de eventos, como: BeginRequest, AuthenticateRequest, etc.
4) Obtenha o HttpHandler que trata da solicitação atual. A compilação em tempo de execução da página ASP.NET também é realizada aqui. (MapHandlerExecutionStep)
Esse processamento é feito chamando o método System.Web.HttpApplication.MapHttpHandler.
No MapHttpHandler, primeiro obtenha o tipo correspondente que implementa IHttpHandlerFactory do web.config de acordo com o endereço acessado. Para páginas asp.net, o padrão é PageHanlderFactory. Em seguida, crie uma instância PageHanlderFactory, chame GetHandlerHelper, chame BuildManager.CreateInstanceFromVirtualPath em GetHandlerHelper para compilar e criar uma instância da página ASP.NET atualmente solicitada (se ela tiver sido compilada, carregue-a diretamente do cache).
CreateInstanceFromVirtualPath passa a tarefa de compilação para BuildManager. CompileWebFile obtém o BuildProvider correspondente de web.config. Para arquivos .aspx, o BuildProvider correspondente é PageBuildProvider. Como o PageBuildProvider compila as páginas não será analisado mais detalhadamente aqui. Se você estiver interessado, poderá estudar mais detalhadamente o código-fonte do ASP.NET 2.0.
5) Chame o método .ProcessRequest do HttpHandler correspondente para processar a solicitação (se for assíncrono, chame BeginProcessReques). (Etapa CallHandlerExecution)
6) Escreva o conteúdo da resposta no Filtro. (CallFilterExecutionStep)
5. Chame BeginProcessRequest da instância HttpApplication para processar a solicitação de forma assíncrona.
Muitas das coisas que acontecem em _execSteps mencionadas acima são executadas depois que HttpRuntime chama HttpApplication BeginProcessRequest e, em seguida, chama ResumeSteps em BeginProcessRequest.
O tempo de execução do ASP.NET 2.0 é uma parte muito complexa, difícil de entender e importante do ASP.NET 2.0. O estudo do código-fonte do tempo de execução do ASP.NET 2.0 nos ajudará a aprofundar nossa compreensão dos princípios do ASP.NET 2.0. give us O desenvolvimento de aplicativos ASP.NET 2.0 traz muita ajuda. Este artigo é a primeira vez que aprendo o tempo de execução do ASP.NET 2.0. Ele foi escrito para me ajudar a entender melhor o tempo de execução do ASP.NET 2.0. Você pode criticar e fazer sugestões sobre o conteúdo do artigo.
Sinto que escrever artigos pode não apenas melhorar as habilidades de escrita e facilitar a comunicação, mas também, através da escrita de artigos, pode-se esclarecer as próprias ideias, promover o pensamento aprofundado e aprofundar a compreensão da tecnologia. Escrever alguns artigos técnicos ainda é muito útil para você se aprimorar.