Desenvolvimento - ASP. NET

Funcionamento do ASP .NET

Tudo começa quando o IIS recebe uma requisição Http, ele examina a mesma, verificando a extensão do arquivo requisitado através da URL, para que possa passar esta requisição para um componente que sabe como trata – la. Isto é feito através de um mapeamento na configuração do IIS...

por Bruno Spinelli Dantas



Tudo começa quando o IIS recebe uma requisição Http, ele examina a mesma, verificando a extensão do arquivo requisitado através da URL, para que possa passar esta requisição para um componente que sabe como trata - la. Isto é feito através de um mapeamento na configuração do IIS.

Quando o ASP .NET é instalado, ele adiciona entradas na configuração do IIS associando extensões de arquivos (.aspx, .asmx, etc) com um componente chamado aspnet_isapi.dll que tem o "conhecimento" de como levar esta requisição até o HttpPipeline.

A principal infra - estrutura do ASP .Net está no chamado HttpPipeline.

O aspnet_isapi.dll passa a requisição para uma instancia de um processo ASP .NET o chamado Asp .Net Workprocess , aspnet_wp.exe. Este processo logo utiliza uma instancia da classe HttpRuntime, que é o inicio do HttpPipeline, para processar a requisição.

Nota: Por padrão somente será utilizado um processo Asp .Net (aspnet_wp.exe) por vez. O processo Asp.Net efetua a separação entre aplicações através dos chamados AppDomains (um processo mais leve dentro de um outro processo), cada AppDomain corresponde a um diretório virtual (é através desta arquitetura que o ASP .Net possibilita a reciclagem de processos Asp .Net).

Quando uma requisição é passada para uma instancia da classe HttpRuntime, a mesma examina a requisição e encaminha para a aplicação certa (no caso diretório virtual). Então ele utiliza um objeto da classe HttpApplicationFactory para encontrar ou criar um objeto HttpApplication para processar a requisição. Um objeto HttpApplication contém uma coleção de módulos Http (HttpModule), que são implementações da interface IHttpModule. Estes módulos Http são como filtros que examinam e modificam o conteúdo da requisição e resposta Http (HttpResponse e HttpRequest) enquanto elas passam pelo Pipeline. O objeto HttpApplication utiliza um HttpHandlerFactory para ou encontrar ou criar um objeto HttpHandler. HttpHandlers são o ponto final do Pipeline, eles são responsáveis por processar a requisição Http (HttpRequest) e gerar a mensagem de resposta (HttpResponse).

Tanto HttpHandler,quanto HandlerFactory implementam as interfaces IHttpHandler, e IHttpHandlerFactory, respectivamente.

Nota: Um HttpApplication , seus módulos (HttpModule), e seus Handlers (Httphandlers), somente serão utilizados para processar uma requisição por vez. Se múltiplas requisições forem destinadas a mesma aplicação simultaneamente, vários objetos HttpApplication serão utilizados.As classes HttpApplicationFactory, e HttpHandlerFactory,fazem um "pool" de objetos HttpApplication e HttpHandler , para o uso eficiente de recursos.

O Pipeline utiliza um objeto da classe HttpContext para representar uma requisição (HttpRequest) e uma resposta (HttpResponse).

Um pouco mais sobre os HttpHandlers

HttpHandlers são classes que implementam a interface IHttpHandler. Esta interface contém apenas um método, ProcessRequest(), e uma propriedade , IsReusable. O método ProcessRequest é chamado por um objeto HttpApplication quando o mesmo quer que o handler processe a requisição e gere a resposta.

A propriedade IsReusable é utilizada para determinar quando o handler pode ser reutilizável. Uma vez que uma classe Httphandler foi implementada, ela precisa estar acessível para o Pipeline. Para que isso ocorra , primeiro você tem que colocar o código compilado em um local que o processo Asp .Net possa acessar , isso quer dizer ou em uma pasta bin no diretório virtual da aplicação, ou no GAC (Global Assembly Cache).

O HttpPipeline é "guiado" através do arquivo de configuração da aplicação e máquina (web.config e machine.config), desta forma você precisa inserir no mesmosum registro que descreva a necessidade da utilização deste Handler.

Nota: Caso seu handler trate requisições a arquivos não comuns ao Asp .Net (.aspx, .asmx, e etc) é necessário o mapeamento do mesmo na configuração do IIS para o componente aspnet_isapi.dll para que esta requisição seja realmente encaminhada para o processo Asp .Net e posteriormente para o HttpPipeline.

Handlers Padrões

Se você examinar o arquivo machine.config verá que já existem alguns handlers registrados, irei ressaltar apenas dois deles : System.Web.UI.Page.PageHandlerFactory, e System.Web.Services.Protocols.WebServiceHandlerFactory.

O PageHandlerFactory será "acionado" para qualquer requisição com extensão .aspx. Este handler sabe como compilar um código .aspx e instancia-lo. Todo arquivo .aspx contém uma classe que deriva de System.Web.UI.Page ,que por sua vez implementa a interface IHttpHandler, sendo assim um objeto que pode ser utilizado diretamente pelo HttpPipeline. Logo o PageHandlerFactory irá instanciar um objeto da classe que deriva de System.Web.UI.Page para manipular a requisição.

WebServiceHandlerFactory será "acionado" para qualquer requisição .asmx, ele é um HandlerFactory que sabe como compilar um código .asmx em uma classe (SyncSessionlessHandler) , e instancia - la. O handler traduz as mensagens SOAP e faz a invocação dos métodos através de Reflection.

É importante ressaltar que estes objetos HandlerFactoy não compilam os códigos toda vez, ao invés disso,o código compilado fica em cachê em um subdiretório na pasta de instalação do .Net, só havendo necessidade de recompilação quando o código sofrer modificações.

Um pouco mais sobre os HttpModules

A classe HttpApplication, que representa uma aplicação, expõe vários eventos. Através destes eventos que os HttpModules têm a oportunidade de modificar as requisições e respostas.

Instâncias de classes handlers consomem requisições Http e produzem respostas Http. HttpModules são filtros que processam requisições , e respostas Http enquanto eles passam através do Pipeline. O Pipeline utiliza HttpModules para implementar sua própria infra - estrutura de segurança, sessão e etc.

HttpModules são classes que implementam a interface IHttpModule. A interface IHttpModule contém apenas os metodos Init e Dispose. O método Init é chamado por um objeto HttpApplication quando módulo é criado, dando a ele a oportunidade de manipular os eventos expostos pela aplicação (HttpApplication).

Para que um HttpModule "seja reconhecido" pelo Pipeline, seu código compilado precisa ser disponibilizado ou em uma pasta "bin" no diretório virtual, ou no GAC. Você também precisa adicionar entradas no arquivo de configuração de sua aplicação (web.config) para que o Pipeline o instancie.

Nota: Você pode customizar sua HttpApplication através do arquivo Global.asax. Logo a HttpFactory sempre irá instanciar a classe implementada pelo Global.asax para processar as requisições de sua aplicação.

Funcionamento dos WebServices

Quando uma mensagem entra no HttpPipeline requisitando um arquivo .asmx, o Pipeline chama um WebServiceHandlerFactory para instanciar um novo objeto WebServiceHandler que pode ser utilizado para processar a requisição (chamando o método ProcessRequest da interface IHandler). O objeto WebServiceHandler abre o arquivo .asmx para determinar o nome da classe que contém os webmethods.

O handler examina a Requisição Http para saber exatamente que método chamar na classe referenciada. Porem antes que o handler possa realmente invocar o método (através de Reflection) ele tem que deserializar os dados (mapear os dados recebidos em XML para objetos .Net).É responsabilidade também do handler gerar o documento WSDL que irá descrever o serviço, este documento é gerado através da querystring "?wsdl".

Esta sendo desenvolvido pela Microsoft , IBM, e outras grandes empresas de influência no mercado novos padrões para Web Services, os Web Services Enhancements (WSE), onde são tratados assuntos como segurança, roteamento de mensagens, e etc. Estes padrões são implementados de forma muito similar aos HttpModules ou seja através de filtros.

Bruno Spinelli Dantas

Bruno Spinelli Dantas - MCAD, Desenvolvedor da nTime Mobile Solutions, dedicando-se exclusivamente a Tecnologia Net, no desenvolvimento de plataformas para dispositivos móveis.