Skip to content

Middleware em ASP.NET Core. O que é? Quando Usar?

No artigo de hoje vamos aprender injetar códigos no HTTP pipeline do ASP.NET Core utilizando Middlewares. Também vamos aprender a como construir um.

“Middleware is defined in the OWIN specification as pass through components that form a pipeline between a server and application. It serves to inspect, route, or modify request and response messages for a specific purpose. Middleware consists of application components are incorporated into the ASP.NET HTTP pipeline.”. A citação está na documentação do ASP.NET Core, e como pode ser visto com Middleware podemos inserir um componente que é incorporado no ASP.NET HTTP Pipeline, ou seja, podemos desenvolver um código com um proposito especifico que será montado para manipular as requisições e respostas, a manipulação da informação pode acontecer nos dois lados do trafego.

Uma característica do Middleware é que normalmente existirá uma cadeia de Middlewares onde por ordem de configuração, um é chamado após a finalização do outro e o Middleware atual poderá a qualquer momento cancelar a invocação do próximo Middleware, fazendo assim que toda a cadeia pare de ser executada.

middlwares

Tem dúvidas ainda? Algumas pessoas comparam Middlewares com o antigo HttpModules, que hoje não mais existe no novo ASP.NET. Eu já vi alguém comparando middlewares com um hambúrguer, porque o meio é middleware e as extremidades são a aplicação e o servidor. Quanto mais middleware, maior é o hambúrguer.

Para que você tenha ainda mais clareza sobre o assunto, eu irei demonstrar alguns Middlewares que já são utilizados por default pela aplicação e como criar um customizado. Mão na massa que agora começa os códigos.

Abaixo é mostrado a classe Startup, perceba que existem alguns comentários que indica onde existe um middleware.

Notou o tanto de middleware que são utilizados em um projeto default no ASP.NET Core? Aqui cada Middleware tem uma responsabilidade e um dos ganhos que temos é que podemos escolher apenas os que são necessários para nosso projeto. Diferente da versão antiga do ASP.NET que por default muitas features eram adicionadas mesmo que o projeto não fosse utilizar. Middleware não é algo novo em desenvolvimento de sistema e isso já é utilizado na plataforma Node.js. Existe um ditado em relação a ele: “pague apenas pelo que você usa”. Em outras palavras, quanto menos middleware você utiliza, menos gargalo existira no HTTP Pipeline e assim mais leve é a aplicação.

Outra coisa a observar no código acima é que todo middleware padrão utilizado começa com um “Use”, isso é um padrão feito pelo time do ASP.NET Core.

Agora vamos criar nosso próprio middleware e nosso objetivo de hoje será construir um que nos alerta o tempo de processamento da aplicação para atender a uma requisição, este será um middleware de log. Abaixo segue o código:

Como podem ver, fazer um middleware não tem nada de difícil. É necessário um construtor para receber o próximo middleware e um método “Invoke” que recebe o contexto do HTTP. O objetivo de mostrar o tempo de requisição da aplicação está no método Invoke. Conforme pode ser visto, antes de chamar o próximo middleware é iniciado o contador do tempo e após a chamada do próximo middleware, isso é, quando todos os middlewares já foram executados, eu mando imprimir no HTML o tempo total da requisição no servidor.

Lembre-se, eu sei que todos os middlewares foram executados por que iniciei o nosso middleware por primeiro, conforme pode ser visto no próximo código, e após a instrução “await _next(context);” ser executada, toda a cadeia de middleware também foi executada conforme a nossa imagem do artigo mais acima.

O código acima é apenas para mostrar como ficou a configuração do middleware no método Configure da classe Startup. Para que isso de certo é necessário que ele seja executado por primeiro e em se tratando de um middleware customizado é necessário usar a instrução “app.UseMiddleware<ResponseTime>();”. Abaixo é visualizado como a informação do log na tela será mostrada.

Conclusão

A algum tempo já venho falando que o ASP.NET Core mudou, não o código que conhecemos, mas sim o seu núcleo e por isso a forma que trabalhávamos para manipular as requisições no passado também foram alteradas para Middleware. Mais leve e mais fácil para ficar entre a aplicação e o servidor. Mas tome cuidado, não é por que ficou melhor que você agora apenas deve desenvolver em middleware.

Você gostou desse artigo? gostaria de saber mais sobre ASP.NET Core? Eu desenvolvi um curso na Udemy, preço camarada e com mais de 13h de curso. Acesse https://www.udemy.com/aspnet-core-aprendendo-do-zero-ao-avancado/

 

Published in.Net Core

3 Comments

  1. rangel rangel

    muito bom parabéns

  2. MAICON SCHUETZ MAICON SCHUETZ

    Stephany,

    Excelente post parabéns!

    Tenho uma dúvida, talvez você possa me ajudar…

    Implementei um middleware semelhante ao do seu post com o objetivo de logar detalhes de um request. Para tal, estou injetando o loggerFactory. Uma das informações que estou logando é o body da requisição. Meu método Invoke:

    public async Task Invoke(HttpContext context)
    {
    var request = context.Request;
    var body;
    using (var stream = new StreamReader(request.Body)) body = stream.ReadToEnd();

    _logger.LogInformation(body);
    await _next.Invoke(context);
    }

    O problema da minha implementação é que após ler o stream do body uma vez, este já não estará mais disponível para uma segunda leitura. Seguindo a ordem no pipeline da minha API, o método do controller acaba recebendo o json ([FromBody]InputModel input) nulo.

    Você sabe me dizer qual o caminho para logar o conteúdo do body em um middleware sem remover o mesmo da requisição?

    Agradeço desde já.

    • stephanybatista stephanybatista

      Não tem como clonar o conteúdo de body? Assim talvez não perca a informação.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *