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.

BlazorImagem em miniaturada da capa do livro eletrônico para-Desenvolvedores-do-ASP-NET-Web-Forms.

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.

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 a maneira como as solicitações do Web Forms ASP.NET 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 no código em vez de arquivos de configuração, geralmente em Startup.cs.

Katana

Os 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 de middleware e pipeline semelhantes para ASP.NET 4.x. O middleware projetado para Katana pode ser adaptado para funcionar com o pipeline do ASP.NET Core.

Middleware comum

ASP.NET 4.x inclui muitos módulos. De maneira 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 nativo do ASP.NET Core 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 ASP.NET Core
Erros 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 Log de Eventos do ASP.NET Core
Cache de arquivos FileCacheModule Middleware de Cache de Resposta
Cache HTTP HttpCacheModule Middleware de Cache de Resposta
Registro de HTTP HttpLoggingModule Log de Eventos 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 principal do ASP.NET

Essa lista não é exaustiva, mas deve dar uma ideia de qual mapeamento existe entre as duas estruturas. 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. 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, implementando a IMiddleware interface ou seguindo a convenção de middleware. Para obter mais informações, confira Escrever middleware do ASP.NET Core personalizado.