Compartilhar via


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.

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

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.

pipeline

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.