Partilhar via


Módulos, manipuladores e middleware

Sugestão

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.

Blazor-for-ASP-NET-Web-Forms-Developers miniatura da capa do eBook.

Um aplicativo ASP.NET Core é criado com base em uma série de middleware. Middleware é um conjunto de manipuladores organizados num fluxo para lidar com pedidos 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.

Visã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.

gasoduto

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 Opção do ASP.NET Core
Erros HTTP CustomErrorModule Middleware de páginas de códigos de estado
Documento padrão DefaultDocumentModule Middleware de arquivos padrão
Navegação no diretório DirectoryListingModule Middleware de navegação no diretório
Compressão dinâmica DynamicCompressionModule Middleware de compressão de resposta
Rastreamento de solicitações falhadas FailedRequestsTracingModule ASP.NET Core Logging
Cache de arquivos FileCacheModule Middleware de cache de resposta
Cache de HTTP HttpCacheModule Middleware de cache de resposta
Registo HTTP HttpLoggingModule ASP.NET Core Logging
Redirecionamento HTTP HttpRedirectionModule Middleware de reescrita de URL
Filtros ISAPI IsapiFilterModule Middleware
ISAPI IsapiModule Middleware
Filtragem de pedidos RequestFilteringModule Reescrita de URL Middleware IRule
Reescrita de URL† RewriteModule Middleware de reescrita de URL
Compressão estática StaticCompressionModule Middleware de compressão de resposta
Conteúdo estático StaticFileModule Middleware de ficheiros estáticos
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 muitas formas de definir middleware, sendo a mais simples a de um delegado simples. Considere o seguinte middleware, que aceita um pedido de configuração cultural a partir de um query string.

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 IMiddleware interface ou seguindo a convenção de middleware. Para obter mais informações, consulte Write custom ASP.NET Core middleware.