Módulos, manipuladores e middleware
Gorjeta
Este conteúdo é um excerto do eBook, Blazor para ASP NET Web Forms Developers for Azure, disponível no .NET Docs ou como um PDF transferível gratuito que pode ser lido offline.
Um aplicativo 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 por middleware. Neste capítulo, você aprenderá sobre middleware no contexto de um Blazor aplicativo.
Descrição geral
O pipeline de solicitação 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 fio da execução segue as setas pretas.
O diagrama anterior carece de um conceito de eventos do ciclo de vida. Esse conceito é fundamental para como ASP.NET solicitações de Web Forms são tratadas. Esse sistema facilita o raciocínio 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. Eles também são adicionados em código em vez de arquivos de configuração, geralmente em Startup.cs.
Katana
Os leitores familiarizados com Katana se sentirão confortáveis em ASP.NET Core. Na verdade, Katana é uma estrutura da qual ASP.NET Core deriva. Ele introduziu padrões semelhantes de middleware e pipeline para ASP.NET 4.x. O middleware projetado para Katana pode ser adaptado para trabalhar com o pipeline ASP.NET Core.
Middleware comum
ASP.NET 4.x inclui muitos módulos. Da mesma forma, 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, middleware nativo do ASP.NET Core pode estar disponível.
A tabela a seguir lista middleware e componentes de substituição no ASP.NET Core.
Módulo | ASP.NET módulo 4.x | ASP.NET opção Core |
---|---|---|
Erros de HTTP | CustomErrorModule |
Middleware de páginas de código de status |
Documento predefinido | DefaultDocumentModule |
Middleware de arquivos padrão |
Navegação nos diretórios | DirectoryListingModule |
Middleware de navegação no diretório |
Compressão dinâmica | DynamicCompressionModule |
Middleware de compressão de resposta |
Rastreamento de solicitações com falha | FailedRequestsTracingModule |
ASP.NET Core Logging |
Cache de arquivos | FileCacheModule |
Middleware de cache de resposta |
Cache HTTP | HttpCacheModule |
Middleware de cache de resposta |
Registo de HTTP | HttpLoggingModule |
ASP.NET Core Logging |
Redirecionamento de HTTP | HttpRedirectionModule |
Middleware de reconfiguração de URL |
Filtros ISAPI | IsapiFilterModule |
Middleware |
ISAPI | IsapiModule |
Middleware |
Filtragem de pedidos | RequestFilteringModule |
URL Reescrevendo Middleware IRule |
Reescrita de URL† | RewriteModule |
Middleware de reconfiguração de URL |
Compressão estática | StaticCompressionModule |
Middleware de compressão de resposta |
Conteúdo estático | StaticFileModule |
Middleware de arquivo estático |
Autorização de URL | UrlAuthorizationModule |
ASP.NET Identidade Principal |
Esta lista não é exaustiva, mas deve dar uma ideia do mapeamento que existe entre os dois frameworks. Para obter uma lista mais detalhada, consulte Módulos do IIS com 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 seu próprio middleware. Existem várias maneiras de definir middleware, sendo a mais simples um simples delegado. 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, implementando a interface ou seguindo a IMiddleware
convenção de middleware. Para obter mais informações, consulte Escrever middleware ASP.NET Core personalizado.