Escolha uma Página

Como fazer tratativas no ASP.NET Core 2.0 usando Filters

Fala pessoal, beleza? Neste post venho dar algumas dicas sobre tratamento de erros em ASP.NET Core 2.0, de forma a facilitar sua vida para identificar problemas e/ou exibir mensagens ao usuário final.

Todos sabemos que erros em APIs REST às vezes podem ser muito difíceis de identificar, e efetuar tratamento individual para todos os seus endpoints utilizando try e catch pode ser muito trabalhoso, e às vezes ineficiente. Por conta disso, resolvi trazer algumas dicas que utilizo no dia a dia e que facilitam bastante o tratamento de erros, deixando o código limpo e elegante.

Vamos ver os seguintes tópicos:

  1. Exception Filter
  2. Action Filter
  3. Log de execução com Serilog

Então vamos lá!

1. Exception Filter

wkunhasibs8vuk5tuyl2

Consiste em cadastrar classes que executam código antes ou depois de determinados estágios do pipeline de processamento da aplicação.

O Exception Filter trata exatamente disso; é uma classe que criamos com o intuito de capturar todas as exceptions disparadas pela nossa aplicação, para podermos trata-las em apenas um único local. Dessa forma, não precisamos de try e catch em local nenhum da aplicação; qualquer exception levantado cairá nesta classe, onde será possível tratar este erro e retorná-lo em um formato conhecido para quem está consumindo nossa API. É uma forma simples e elegante de deixar seu código limpo.

Para criar um Exception Filter, primeiramente devemos criar uma classe implementando a interface de IExceptionFilter.

Nesta classe, iremos fazer override do método OnException, que nos permite capturar o contexto em que ocorreu a exception. A partir deste contexto conseguimos identificar o erro, efetuar o tratamento e retorna-lo ao front.

Neste exemplo eu alterei o status da requisição para Internal Server Error (500), coloquei o ContentType da response como “application/json” e converti a exception para JSON, salvando ela no body da response.

Desta forma, qualquer erro que acontecer na API passará por este método, que pode fazer o tratamento, converter o erro para alguma classe de retorno e enviar como resposta a quem solicitou, nos permitindo até mesmo traduzir erros conhecidos.

Segue um exemplo mais complexo da classe onde eu identifico algumas exceptions, faço traduções pelo resource, converto classes, etc.

Lembrando que a classe nos permite injetar dependências pelo construtor, possibilitando adicionar resources, loggers, etc, o que permite uma grande flexibilidade no tratamento das exceptions.

Após criar a classe, precisamos adicioná-la aos filtros do ASP.NET Core.
Para isto, basta abrir a classe Startup.cs, e no método ConfigureServices, adicionar o Filter criado.

Após isto, só correr para o abraço. Sua aplicação *provavelmente* já está tratando as exceções na sua classe de filter.

2. Action Filter

restapi

O Action Filter, nada mais é que um Attribute do ASP.NET. através deles podemos marcar métodos da controller para executar ações antes do método ser efetivamente executado.
Neste caso, demonstrarei como validar se a model recebido pela sua controller é válida.
Para tal, criamos um Attribute que herda de ActionFilterAttribute.

Precisamos agora fazer override no método OnActionExecuting, o qual nos disponibiliza o context como parâmetro, e neste context podemos validar o ModelState, e nesta validação levantar uma exceção, que cairá no nosso ExceptionFilter para tratar seu retorno.

Agora, para utilizar este Attribute, basta marcar os métodos em sua controller que irão utilizá-lo.

Pronto! Agora este método validará se o model recebido como parâmetro foi corretamente formatado.

Se quisermos especificar mais, e detalhar a mensagem de erro, podemos capturar as exceptions detalhadamente para identificar exatamente onde a model está mal formatada.

3. Log de execução com Serilog

617q2

Por fim, vou demonstrar algo rápido e simples de se implementar, mas muito útil!
O serilog irá rastrear todas as chamadas à api, detalhando em qual método ocorreu erro, qual exception foi levantada, e muitos outros detalhes que facilitam bastante identificar erros na api.

Para implementa-lo, é incrivelmente fácil:

    1. Instalar via nuget o pacote Serilog.Extensions.Logging.File;
    2. Adicionar a sessão “Logging” no appsettings.json;

    1. Adicionar ao método Configure do arquivo Startup.cs a interface ILoggerFactory e configurá-la, adicionando a sessão Logging configurada anteriormente a ela, e definindo um local para salvar o arquivo de log.

É só isso, e pronto! A partir de agora, todas as chamadas à api serão logadas.

Então, é isto que eu gostaria de compartilhar hoje.

Espero que tenham gostado.

Um grande abraço, valeu!