Asp.Net introdução do IHttpHandler ASP.NET duas interfaces de processamento comumente usadas ao responder a requisições Http são IHttpHandler e IHttpModule.
Em geral, o IHttpHandler é usado para lidar com um tipo específico de requisição, como o processamento separado de cada arquivo *.asp, *.aspx. O IHttpModule geralmente é usado para lidar com operações comumente exigidas para a solicitação, como realizar algumas das mesmas verificações na página da solicitação.
Vamos dar uma olhada nas etapas de processamento do servidor IIS ao fazer a requisição HTTP correspondente. ASP.NET possui o conceito de pipeline, o que significa que cada requisição ASP.NET terá uma série de operações correspondentes no IIS para formar uma sequência semelhante a uma linha.
ASP.NET introdução ao pipeline
Vamos dar uma olhada no diagrama de tempo de processamento do pipeline:
Como pode ser visto na figura, após a chegada da solicitação, a implementação é processada pelo HttpModule e então o método ProcessRequest() do HttpHandler é chamado para dar a resposta específica. Portanto, não é difícil entender por que o tratamento de requisições específicas de classe é colocado na classe HttpHandler enquanto se fazem algumas verificações comuns a todas as solicitações no HttpModule.
Prática de código
IHttpHandler
O autor recentemente se deparou com o uso do IHttpHandler para lidar com chamadas de interface de cliente no projeto, então vamos discutir brevemente o design simples da interface baseado no IHttpHandler.
A interface IHttpHandler tem apenas dois membros:
O atributo IsReusable identifica se o objeto HttpHandler pode ser usado por outras instâncias, e geralmente o definimos como True. O método ProcessRequest() é uma resposta específica à solicitação, e só precisamos colocar a operação específica de lógica de negócio aqui.
Primeiro, crie um novo projeto web e adicione uma classe Handler:
A classe RayHandler implementa a função ProcessRequest() da interface IHttpHandler, que é apenas uma saída direta de um pedaço de texto.
Depois, precisamos adicionar a seguinte configuração no arquivo Web.config:
path indica correspondência de URLs, como *.ray, o que significa que o Handler responderá a requisições de URL terminadas em ".ray", verb indica o método de requisição, como Get/Post, e * significa que corresponde a todos. type indica o tipo da classe Handler, WebApplication2.RayHandler é o nome da classe, WebApplication2 refere-se ao nome do assembly no diretório Bin, por exemplo, o nome assembly no exemplo é WebApplication2.dll, e não há necessidade de definir um nome de sufixo aqui.
Inicie o site, insira a URL terminando em ".ray" e você verá o seguinte resultado:
Visão geral da fábrica do IHttpHandlerFactory
Às vezes podemos precisar lidar com múltiplos sufixos diferentes, um deles correspondendo a uma classe Handler, e é assim que nosso arquivo Web.config se apresenta:
Se tivermos muitas classes de implementação do HttpHandler, então nossa configuração de arquivos Web.config certamente vai parecer detalhada. Ou, em alguns casos, quando só conseguimos determinar qual Handler responde quando o programa está rodando, precisamos usar IHttpHandlerFactory.
O IHttpHandlerFactory é definido da seguinte forma:
Entre eles:
GetHandler(): Retorna uma instância que implementa a interface IHttpHandler; ReleaseHandler(): Permite que o Factory reutilize uma instância Handler existente. Pegue os pedidos ray e rss acima como exemplo, implemente a classe Factory:
Nesse caso, a configuração no Web.config é a seguinte:
Neste momento, a função de usar a classe Factory para corresponder a diferentes manipuladores específicos é implementada, simplificando a configuração.
Fábrica Escalável IHttpHandlerFactory
Na implementação acima, se o programa precisar adicionar um novo método de tratamento de sufixos no futuro, ele precisa modificar a instrução Switch em GetHandler(), o que também pode causar erros ou trazer outros riscos de segurança. Então, é possível manter a classe HandlerFactory inalterada para extensões subsequentes?
A resposta é definitivamente sim. Leitores que conhecem o padrão de design devem entender que este é um padrão simples de fábrica, e para alcançar as funções anteriores, podemos usar o modo de design chamado advanced points.
E aqui, também podemos usar a característica de linguagem da linguagem C# - reflexão. Por meio do mecanismo de reflexão de C#, refletimos o tipo Hanlder correspondente de acordo com o sufixo da URL, desde que concordemos com a correspondência entre o nome do sufixo da URL e o nome da classe do Handler.
Por exemplo, reescrevemos GetHandler() da seguinte forma:
Nesse caso, você só precisa colocar a classe Handler no método sob o mesmo namespace da classe HandlerFactory e configurá-la corretamente no Web.config. Por exemplo, se existir uma classe RayTHandler, então a seguinte configuração deve ser adicionada para combinar automaticamente:
resumo Este artigo apresenta brevemente o uso do IHttpHandler em ASP.NET, fornece a implementação do IHttpHandlerFactory no processamento de múltiplas requisições Handler e, por fim, melhora uma implementação escalável de múltiplos requests Handler usando o mecanismo de reflexão do C#.
|