8.2 Pipeline ASP.NET e ciclo de vida do aplicativo
A Seção 8.1 apresenta a arquitetura do sistema IIS e o processo geral de processamento de solicitações HTTP. A partir dela, podemos saber que cada site ASP.NET corresponde a um aplicativo Web, que pode responder a solicitações HTTP e fornecer aos usuários as informações necessárias. Então, como exatamente um aplicativo ASP.NET responde às solicitações HTTP? Quais procedimentos de processamento específicos estão incluídos? Isso envolve o ciclo de vida dos aplicativos ASP.NET.
8.2.1 Ciclo de vida do aplicativo ASP.NET*
Esta seção toma o IIS 6 como exemplo para apresentar passo a passo o processo de processamento de solicitações HTTP por aplicativos ASP.NET. O processo do IIS 7 tem algumas pequenas alterações em comparação com o IIS 6, mas é geralmente consistente.
1 O navegador emite uma solicitação HTTP para acessar uma página da Web ASP.NET.
Suponha que esta solicitação seja a primeira solicitação ao aplicativo ASP.NET ao qual esta página da Web pertence.
Quando esta solicitação chega ao servidor Web, o HTTP.SYS é responsável por recebê-la. De acordo com a URL desta solicitação, o HTTP.SYS a passa para o pool de aplicativos correspondente a este aplicativo ASP.NET e para o pool de aplicativos em execução neste aplicativo. Os processos de trabalho do pool são responsáveis pelo processamento de solicitações [1].
Depois que o processo de trabalho recebe essa solicitação, ele carrega uma extensão ISAPI "aspnet_isapi.dll" dedicada ao processamento de páginas ASP.NET e passa a solicitação HTTP para ela.
Após o processo de trabalho carregar o aspnet_isapi.dll, o aspnet_isapi.dll é responsável por carregar o ambiente de execução da aplicação ASP.NET - CLR [2].
O processo de trabalho funciona em um ambiente não gerenciado (referindo-se ao próprio sistema operacional Windows), enquanto os objetos no .NET funcionam em um ambiente gerenciado (referindo-se ao CLR aspnet_isapi.dll atua como uma ponte para comunicação entre os dois). as solicitações recebidas (de um ambiente não gerenciado) são encaminhadas para o objeto .NET correspondente (em um ambiente gerenciado) para processamento.
2 Crie o objeto ApplicationManager e o domínio do aplicativo
Após o carregamento do CLR, a classe ApplicationManager é responsável por criar um domínio de aplicação. Cada aplicativo ASP.NET é executado em seu próprio domínio de aplicativo e é identificado por um identificador de aplicativo exclusivo.
Cada domínio de aplicativo corresponde a uma instância da classe ApplicationManager, que é responsável por gerenciar aplicativos ASP.NET em execução no domínio (como iniciar e parar um aplicativo ASP.NET, criar objetos em um aplicativo ASP.NET especificado, etc.) .
3 Crie o objeto HostingEnvironment
Ao criar um domínio de aplicação para uma aplicação ASP.NET, é criado um objeto HostingEnvironment, que fornece algumas informações de gerenciamento para a aplicação ASP.NET (como a identidade da aplicação ASP.NET, o diretório virtual correspondente e o diretório físico), e fornece algumas funcionalidades adicionais (como registrar um objeto no domínio do aplicativo, representar um usuário específico, etc.).
4 Crie objetos ASP.NET Core para cada solicitação
Quando o domínio da aplicação é criado, um objeto ISAPIRuntime é criado e seu método ProcessRequest() é chamado automaticamente. Neste método, o objeto ISAPIRuntime cria um objeto HttpWorkerRequest com base na solicitação HTTP recebida. Esse objeto agrupa várias informações da solicitação HTTP de maneira orientada a objetos (ou seja, as informações originais da solicitação HTTP são encapsuladas como um objeto HttpWorkerRequest). Em seguida, chame o método StartProcessing() do objeto ISAPIRuntime para iniciar todo o processo de processamento de solicitação HTTP (este é o "Pipeline HTTP: Pipeline HTTP). No início deste processo de processamento, um objeto do tipo HttpRuntime é criado e o objeto do tipo HttpRuntime é criado". O objeto HttpWorkerRequest criado anteriormente é usado como Os parâmetros do método são passados para o método ProcessRequest() deste objeto HttpRuntime.
Alguns trabalhos muito importantes são realizados no método ProcessRequest() da classe HttpRuntime, entre os quais os mais relacionados aos engenheiros de software Web são:
O método ProcessRequest() da classe HttpRuntime cria um objeto HttpContext com base nas informações de solicitação HTTP fornecidas no objeto HttpWorkerRequest.
O objeto HttpContext é importante porque contém dois outros objetos que são muito comuns na programação ASP.NET: HttpResponse e HttpRequest.
As informações no objeto HttpRequest vêm da solicitação HTTP original. Por exemplo, seu atributo Url representa a URL nas informações da solicitação HTTP original.
O objeto HttpResponse possui algumas propriedades e métodos para gerar informações a serem retornadas ao navegador.
A classe Page fornece propriedades correspondentes para fazer referência a esses dois objetos, para que você possa usar diretamente as propriedades "Requset" e "Response" para acessar esses dois objetos na página da Web ASP.NET. Por exemplo:
classe parcial pública _Default: System.Web.UI.Page
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
Resposta .Write(Solicitação .Url);
}
}
A propriedade Context da classe Page refere-se ao objeto HttpContext, portanto o código acima também pode ser reescrito no seguinte formato:
classe parcial pública _Default: System.Web.UI.Page
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
this.Context.Response .Write(this.Context.Request .Url);
}
}
Em relação aos três objetos HttpContext, HttpResponse e HttpRequest, você deve dominar os seguintes pontos:
l O objeto HttpContext contém dois objetos, HttpResponse e HttpRequest. Você pode obter informações relacionadas à solicitação HTTP do objeto HttpRequest, e o conteúdo a ser enviado para o navegador pode ser obtido chamando o método HttpResponse.
l Para cada solicitação HTTP, o ASP.NET cria um objeto HttpContext, que fica acessível durante todo o processamento HTTP.
5 Aloque um objeto HttpApplication para lidar com a solicitação
Além de criar o objeto HttpContext, o método ProcessRequest() da classe HttpRuntime também completa outro trabalho muito importante - solicitar a alocação de um objeto HttpApplication para uma instância da classe HttpApplicationFactory [3] para gerenciar cada etapa de todo o processamento da solicitação HTTP. tipo de evento.
O objeto HttpApplicationFactory é responsável por gerenciar um pool de objetos HttpApplication [4]. Quando uma solicitação HTTP chega, se houver um objeto HttpApplication disponível no pool, esse objeto será alocado diretamente para processar a solicitação HTTP. criado.
6 O objeto HttpApplication inicia o pipeline HTTP
O objeto HttpApplication é responsável por montar todo o "pipeline de processamento de solicitação HTTP (pipeline HTTP)". O "pipeline de processamento de solicitação HTTP" pode ser comparado ao "pipeline de produção" em uma fábrica moderna. O objeto HttpContext criado na etapa anterior é o "produto" a ser processado por este pipeline de produção. Quando flui através de diferentes partes do "pipeline de produção", ele será processado e processado especificamente.
Como ocorrem esses “processos e tratamentos” específicos?
Simplificando, quando o objeto HttpContext passa por diferentes partes do "pipeline de produção", o objeto HttpApplication acionará uma série de eventos [5]. Um componente específico - o módulo HTTP (Módulo HTTP) pode responder a esses eventos. Neste código de resposta de evento, o objeto HttpContext pode ser "processado e processado". ”trabalhadores em. O módulo HTTP é na verdade o "filtro ISAPI" introduzido anteriormente.
O objeto do módulo HTTP é criado no método InitModules() [6] do objeto HttpApplication Geralmente escrevemos código no método Init() [7] do objeto do módulo HTTP para que ele possa responder a eventos específicos acionados pelo HttpApplication. objeto.
ASP.NET fornece alguns módulos HTTP predefinidos para responder a eventos específicos, e os engenheiros de software da Web também podem escrever seus próprios módulos HTTP e inseri-los no "pipeline de processamento de solicitações HTTP" [8].
No meio do pipeline (após o processamento dos eventos relacionados), o objeto HttpContext é recebido pelo objeto Page final (é por isso que o objeto HttpContext pode ser acessado na página ASP.NET através da propriedade Context definida pela classe Page).
Cada página ASP.NET acessada será convertida em uma "classe de página derivada da classe Page".
Nota: A classe Page implementa a interface IHttpHandler, que define um método ProcessRequest().
Depois que a classe de página ASP.NET é gerada, ela é compilada automaticamente em um assembly e, em seguida, seu método ProcessRequest() é chamado automaticamente (como a classe Page implementa a interface IHttpHandler, ela deve ter esse método). Neste método, o código escrito pelo engenheiro de software web é executado (se houver). O resultado da execução do método ProcessRequest() é novamente transportado pelo objeto HttpContext, o controle é transferido de volta para o "pipeline de processamento de solicitação HTTP" e o objeto HttpApplication continua a disparar eventos subsequentes. Neste momento, se houver módulos HTTP específicos que respondam a esses eventos, eles serão chamados automaticamente.
O objeto HttpContext traz o resultado final do processamento para o final do "pipeline de processamento de solicitação HTTP", e suas informações são retiradas e transmitidas ao processo de trabalho novamente usando aspnet_isapi.dll como ponte. O processo de trabalho então transfere os resultados do processamento da solicitação HTTP para HTTP.SYS, que é responsável por retornar os resultados ao navegador.
De acordo com a introdução anterior, todo o pipeline HTTP pode ser dividido em três seções: estágio de pré-processamento, estágio de processamento e estágio de pós-processamento (Figura 8-14).
Figura 8 ‑ 14 Três estágios do pipeline HTTP
Conforme mostrado na Figura 8 ‑14, os estágios de pré-processamento e pós-processamento do pipeline HTTP são participados principalmente por vários módulos HTTP e são conduzidos por eventos. O trabalho concluído nesses dois estágios é principalmente para executar vários atributos. do objeto HttpContext.
O processamento de solicitações HTTP é finalmente concluído na "fase de processamento" por um objeto que implementa a interface IHttpHandler. Cada classe de página gerada por páginas da Web ASP.NET implementa essa interface. O objeto PageHandlerFactory [9] é responsável por criar um objeto de processamento de solicitação HTTP adequado.
Percebe-se que o objeto que implementa a interface IHttpHandler é responsável pelo processamento das solicitações HTTP, por isso é denominado “Handler (handler)”.
Além das páginas da Web ASP.NET mais comuns, os engenheiros de software da Web também podem criar seus próprios objetos que implementam a interface IHttpHandler e inseri-los no pipeline HTTP para lidar com solicitações HTTP.
Quando a solicitação HTTP é processada, os objetos relacionados são liberados, mas o domínio do aplicativo criado, HttpApplication e outros objetos ainda sobrevivem para responder à próxima solicitação HTTP.
7 Resumo do ciclo de vida do aplicativo ASP.NET
Esta seção apresenta o ciclo de vida dos aplicativos ASP.NET. Este é um processo bastante complexo e pode ser mais fácil de entender com a seguinte analogia popular:
l "Pipeline de processamento de solicitação HTTP" é uma "linha de montagem de produção" em uma fábrica moderna, e o objeto HttpContext é o produto a ser processado nesta linha de montagem.
l O objeto HttpHandler (manipulador HTTP) é o núcleo de toda a "linha de produção do produto", responsável pela montagem do produto na forma.
l HttpModule (módulo HTTP) equivale a trabalhadores auxiliares na "linha de produção". Eles realizam "pré-processamento" (preparação para montagem do produto) e "pós-processamento" (preparação para entrega do produto, como etiquetagem) em. o produto (objeto HttpContext)).
l O objeto HttpApplication é o “líder” de toda a “linha de produção”. Ele é responsável por alocar trabalhadores para a “linha de produção” (inicializar e carregar todos os HttpModules registrados), e então disparar uma série de eventos (chamados “ASP. NET" "), um HttpModule específico é responsável por responder a eventos específicos.
-------------------------------------------------- ----------------------------------
[1] Se o processo de trabalho não existir, o programa de monitoramento do IIS WAS criará um, caso contrário, o processo de trabalho existente será reutilizado.
[2] No modo integrado do IIS 7, como o CLR é pré-carregado, esta etapa não é necessária.
[3] "Instância de classe" e "objeto de classe" têm o mesmo significado e ambos se referem a objetos criados usando classes como modelos.
[4] Pool de objetos (pool de objetos) é um método comum de organização de objetos em sistemas de software orientados a objetos. Ele pode ser considerado um contêiner de objetos. O conjunto de objetos contém vários objetos criados antecipadamente. Quando o mundo exterior precisa de um objeto, ele pode retirar diretamente um objeto pronto do pool e utilizá-lo, evitando assim a perda de desempenho causada pela criação frequente de objetos.
[5] HttpApplication define alguns eventos Para obter uma lista completa de eventos, consulte o MSDN.
[6] Este método será chamado automaticamente ao obter o objeto HttpApplication.
[7] Todos os módulos HTTP devem implementar a interface IHttpModule, e o método Init() é definido por esta interface.
[8] Módulos HTTP personalizados podem ser adicionados ao fluxo de processamento de solicitações HTTP inserindo conteúdo específico no Web.Config.
[9] Este é outro núcleo da estrutura da tecnologia ASP.NET