Módulos, manipuladores e middleware
Dica
Esse conteúdo é um trecho do livro eletrônico, Blazor para Desenvolvedores do ASP NET Web Forms para o Azure, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
Um aplicativo do ASP.NET Core é criado com base em uma série de middleware. Middleware são manipuladores organizados em um pipeline para lidar com solicitações e respostas. Em um aplicativo Web Forms, manipuladores HTTP e módulos resolvem problemas semelhantes. No ASP.NET Core, módulos, manipuladores, Global.asax.cs e o ciclo de vida do aplicativo são substituídos pelo middleware. Neste capítulo, você aprenderá sobre o middleware no contexto de um aplicativo Blazor.
Visão geral
O pipeline de solicitação do ASP.NET Core consiste em uma sequência de delegados de solicitação, chamados um após o outro. O diagrama a seguir demonstra o conceito. O thread de execução segue as setas pretas.
O diagrama anterior não tem um conceito de eventos de ciclo de vida. Esse conceito é fundamental para como as solicitações de ASP.NET Web Forms são tratadas. Esse sistema torna mais fácil raciocinar sobre qual processo está ocorrendo e permite que o middleware seja inserido a qualquer momento. O middleware é executado na ordem em que é adicionado ao pipeline de solicitação. Ele também é adicionado no código em vez de arquivos de configuração, geralmente em Startup.cs.
Katana
Leitores familiarizados com Katana se sentirão confortáveis no ASP.NET Core. Na verdade, Katana é uma estrutura da qual o ASP.NET Core deriva. Ele introduziu padrões semelhantes de middleware e pipeline para o ASP.NET 4.x. O middleware projetado para Katana pode ser adaptado para trabalhar com o pipeline do ASP.NET Core.
Middleware comum
O ASP.NET 4.x inclui muitos módulos. De forma semelhante, o ASP.NET Core também tem muitos componentes de middleware disponíveis. Os módulos do IIS podem ser usados em alguns casos com o ASP.NET Core. Em outros casos, o middleware do ASP.NET Core nativo pode estar disponível.
A tabela a seguir lista os componentes e middleware de substituição no ASP.NET Core.
Módulo | Módulo ASP.NET 4.x | Opção do ASP.NET Core |
---|---|---|
Erros de HTTP | CustomErrorModule |
Middleware de páginas de código de status |
Documento padrão | DefaultDocumentModule |
Middleware de arquivos padrão |
Pesquisa no diretório | DirectoryListingModule |
Middleware de navegação no diretório |
Compactação dinâmica | DynamicCompressionModule |
Middleware de compactação de resposta |
Rastreamento de solicitação com falha | FailedRequestsTracingModule |
Registro em log do ASP.NET Core |
Cache de arquivo | FileCacheModule |
Middleware de Cache de Resposta |
Cache HTTP | HttpCacheModule |
Middleware de Cache de Resposta |
Log de FTP | HttpLoggingModule |
Registro em log do ASP.NET Core |
Redirecionamento HTTP | HttpRedirectionModule |
Middleware de regravação de URL |
Filtros ISAPI | IsapiFilterModule |
Middleware |
ISAPI | IsapiModule |
Middleware |
Filtragem de solicitações | RequestFilteringModule |
IRule de middleware de reescrita de URL |
Reescrita de URL† | RewriteModule |
Middleware de regravação de URL |
Compactação estática | StaticCompressionModule |
Middleware de compactação de resposta |
Conteúdo estático | StaticFileModule |
Middleware de arquivos estáticos |
Autorização de URL | UrlAuthorizationModule |
Identidade do ASP.NET Core |
Essa lista não é exaustiva, mas deve dar uma ideia de qual mapeamento existe entre as duas estruturas. Para obter uma lista mais detalhada, confira Módulos do IIS com o ASP.NET Core.
Middleware personalizado
O middleware interno pode não lidar com todos os cenários necessários para um aplicativo. Nesses casos, faz sentido criar o próprio middleware. Há várias maneiras de definir o middleware, sendo o mais simples um delegado simples. Considere o seguinte middleware, que aceita uma solicitação de cultura de uma cadeia de caracteres de consulta:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await next();
});
app.Run(async (context) =>
await context.Response.WriteAsync(
$"Hello {CultureInfo.CurrentCulture.DisplayName}"));
}
}
O middleware também pode ser definido como classe, seja implementando a interface IMiddleware
, seja seguindo a convenção de middleware. Para obter mais informações, confira Escrever middleware do ASP.NET Core personalizado.