ASP.NET módulos HTTP e manipuladores HTTP

Este artigo apresenta os módulos HTTP (Protocolo de Transferência de Hipertexto) ASP.NET e manipuladores HTTP.

Versão original do produto: ASP.NET
Número de KB original: 307985

Resumo

Módulos HTTP e manipuladores HTTP são parte integrante da arquitetura ASP.NET. Enquanto uma solicitação está sendo processada, cada solicitação é processada por vários módulos HTTP (por exemplo, o módulo de autenticação e o módulo de sessão) e, em seguida, é processada por um único manipulador HTTP. Depois que o manipulador processa a solicitação, a solicitação flui de volta pelos módulos HTTP.

Visão geral dos módulos HTTP

Os módulos são chamados antes e depois da execução do manipulador. Os módulos permitem que os desenvolvedores interceptem, participem ou modifiquem cada solicitação individual. Os módulos implementam a IHttpModule interface, que está localizada no System.Web namespace.

Eventos disponíveis que os módulos HTTP podem sincronizar com

Uma HttpApplication classe fornece uma série de eventos com os quais os módulos podem sincronizar. Os eventos a seguir estão disponíveis para que os módulos sejam sincronizados com em cada solicitação. Esses eventos são listados em ordem sequencial:

  • BeginRequest: a solicitação foi iniciada. Se você precisar fazer algo no início de uma solicitação (por exemplo, exibir faixas de anúncio na parte superior de cada página), sincronize esse evento.

  • AuthenticateRequest: se você quiser conectar seu próprio esquema de autenticação personalizado (por exemplo, procure um usuário em um banco de dados para validar a senha), crie um módulo que sincronize esse evento e autentica o usuário como você deseja.

  • AuthorizeRequest: esse evento é usado internamente para implementar mecanismos de autorização (por exemplo, para armazenar suas ACLs (listas de controle de acesso) em um banco de dados e não no sistema de arquivos). Embora você possa substituir este evento, não há muitas boas razões para fazê-lo.

  • ResolveRequestCache: este evento determina se uma página pode ser servida no cache de saída. Se você quiser escrever seu próprio módulo de cache (por exemplo, criar um cache baseado em arquivo em vez de um cache de memória), sincronize esse evento para determinar se serve a página do cache.

  • AcquireRequestState: o estado da sessão é recuperado do repositório de estado. Se você quiser criar seu próprio módulo de gerenciamento de estado, sincronize esse evento para capturar o estado da sessão do repositório de estado.

  • PreRequestHandlerExecute: esse evento ocorre antes da execução do manipulador HTTP.

  • PostRequestHandlerExecute: esse evento ocorre após a execução do manipulador HTTP.

  • ReleaseRequestState: o estado da sessão é armazenado novamente no repositório de estado. Se você estiver criando um módulo de estado de sessão personalizado, deverá armazenar seu estado de volta no repositório de estado.

  • UpdateRequestCache: este evento grava a saída de volta no cache de saída. Se você estiver criando um módulo de cache personalizado, escreva a saída de volta para o cache.

  • EndRequest: a solicitação foi concluída. Você pode querer criar um módulo de depuração que coleta informações durante toda a solicitação e grava as informações na página.

Os eventos a seguir estão disponíveis para que os módulos sejam sincronizados com cada transmissão de solicitação. A ordem desses eventos não é determinística.

  • PreSendRequestHeaders: esse evento ocorre antes de os cabeçalhos serem enviados. Se você quiser adicionar cabeçalhos adicionais, poderá sincronizar esse evento de um módulo personalizado.

  • PreSendRequestContent: esse evento ocorre quando o Response.Flush método é chamado. Se você quiser adicionar conteúdo adicional, poderá sincronizar esse evento de um módulo personalizado.

  • Error: esse evento ocorre quando ocorre uma exceção não tratada. Se você quiser escrever um módulo personalizado do manipulador de erros, sincronize este evento.

Configurar módulos HTTP

O <httpModules> manipulador da seção de configuração é responsável por configurar os módulos HTTP em um aplicativo. Ele pode ser declarado no nível do computador, do site ou do aplicativo. Use a seguinte sintaxe para o manipulador de <httpModules> seção:

<httpModules>
    <add type="[COM+ Class], [Assembly]" name="[ModuleName]" />
    <remove type="[COM+ Class], [Assembly]" name="[ModuleName]" />
    <clear />
</httpModules>

Criar módulos HTTP

Para criar um módulo HTTP, você deve implementar a IHttpModule interface. A IHttpModule interface tem dois métodos com as seguintes assinaturas:

void Init(HttpApplication);
void Dispose();

Visão geral dos manipuladores HTTP

Os manipuladores são usados para processar solicitações individuais de ponto de extremidade. Os manipuladores permitem que a estrutura ASP.NET processe URLs HTTP individuais ou grupos de extensões de URL em um aplicativo. Ao contrário dos módulos, apenas um manipulador é usado para processar uma solicitação. Todos os manipuladores implementam a IHttpHandler interface, que está localizada no System.Web namespace. Os manipuladores são análogos às extensões ISAPI (Internet Server Application Programming Interface).

Configurar manipuladores HTTP

O <httpHandlers> manipulador da seção de configuração é responsável por mapear URLs de entrada para a IHttpHandler classe ou IHttpHandlerFactory . Ele pode ser declarado no nível do computador, do site ou do aplicativo. Subdiretórios herdam essas configurações.

Os administradores usam a <add> diretiva de marca para configurar a <httpHandlers> seção. <Add> as diretivas são interpretadas e processadas em uma ordem sequencial de cima para baixo. Use a seguinte sintaxe para o manipulador de <httpHandler> seção:

<httpHandlers>
    <add verb="[verb list]" path="[path/wildcard]" type="[COM+ Class], [Assembly]" validate="[true/false]" />
    <remove verb="[verb list]" path="[path/wildcard]" />
    <clear />
</httpHandlers>

Criar manipuladores HTTP

Para criar um manipulador HTTP, você deve implementar a IHttpHandler interface. A IHttpHandler interface tem um método e uma propriedade com as seguintes assinaturas:

void ProcessRequest(HttpContext);
bool IsReusable {get;}

Observação

Se o estado da sessão for necessário no manipulador HTTP, você também precisará implementar a IRequiresSessionState interface.