ASP .NET Core MVC - Tratamento de exceções - II

 Neste artigo veremos como realizar o tratamento de erros em aplicações ASP .NET Core MVC.

      

Continuando a primeira parte do artigo veremos agora como configurar páginas de código de status.

Nota: Vamos usar o mesmo projeto criado no artigo anterior.

Já viemos que por padrão o template padrão para a aplicação ASP .NET Core MVC não fornece uma página de código de status detalhada para código de status HTTP como 404. Para isso temos que configurar o middleware de páginas de código de status.

O middleware StatusCodePages lida com os códigos de status retornados pelo aplicativo que estão entre 400 e 599 e não possuem um body.

Existem três extensões diferentes para o middleware disponível.

  1. UseStatusCodePages
    Essa é a extensão mais simples. Quando ela é adicionada ao pipeline, qualquer código de status produzido que corresponda aos critérios acima será interceptado e uma resposta de texto simples será retornada ao chamador.

    A seguir temos um exemplo do que seria retornado se uma requisiçãoo fosse feita para uma página que não existisse:
    Status Code: 404; Not Found
     
  2. UseStatusCodePagesWithRedirects
    Esta extensão permitirá que você configure uma página de erro amigável ao usuário, em vez de apenas a opção de texto sem formatação acima.

    Essa extensão e a próxima são extremamente semelhantes em como funcionam, exceto por uma diferença fundamental. Ela vai redirecionar a resposta para a localização da página de erro, no entanto, ao fazer isso, a resposta de erro original será perdida.

    O chamador verá um código de status 200 a partir do carregamento da página de erro, mas não o código de status real que acionou o erro.

    Isso pode não importar para você, mas esta tecnicamente errado, pois você estará retornando um código de status de sucesso quando realmente houve um erro, e, você terá que decidir se isso está correto para o seu caso de uso.
     
  3. UseStatusCodePagesWithReExecute
    Esta é a configuração que iremos usar no exemplo do artigo, e talvez a mais indicada para a maioria dos casos. O middleware selecionará os códigos de status correspondentes que serão retornados e, em seguida, executará novamente o pipeline.

    Assim, quando a página de erro amigável for retornada, o código de status de erro correto também é retornado.

    Vamos adicionar a seguinte linha abaixo do middleware ExceptionHandler da aplicação criada no artigo anterior:
     app.UseStatusCodePagesWithReExecute("/Error/{0}");

    O método Configure deve ficar assim:

    Usamos o espaço reservado {0} ao definir a rota de erro, e ele será preenchido com o código de status que acionou o middleware; podemos então pegar esse valor em uma Action no controlador ErrosController.

A seguir vamos incluir o método Action HandleErrorCode no controlador conforme abaixo:

Da mesma forma que o middleware ExceptionHandler, o middleware StatusCodePages preenche um objeto para fornecer mais informações sobre o problema que ocorreu.

Agora podemos solicitar um IStatusCodeExecuteFeature da coleção Features das requisições atuais e com isso podemos acessar 3 propriedades:

  • OriginalPathBase
  • OriginalPath
  • OriginalQueryString

Isso me permite acessar a rota que acionou o código de status junto com quaisquer dados de querystring que possam ser relevantes. A seguir atribuimos os dados ao ViewBag para exibir em uma view.

Observe que utilizamos uma única Action para tratar todos os código de status. Entretanto você pode também definir Actions diferentes para diferentes códigos de status.

Para testar altere a variável de ambiente para o ambiente de produção e em HomeController inclua o código abaixo para a Action Contact:

public IActionResult Contact()
{
   ViewData["Message"] = "Your contact page.";
   Response.StatusCode = 404;
   return View("PaginaNaoEncontrada");
}

Executando o projeto e clicando no menu Contact teremos o seguinte resultado:

Assim apresentamos algumas alternativas bem simples que você pode usar para fazer o tratamento de erros globais em sua aplicação ASP .NET Core MVC.

A utilização dos middlewares de tratamento de erros do MVC é o meio mais recomendado a ser usado para tratar exceções em suas aplicações, mas existem situações nas quais você vai precisar ter acesso ao contexto do MVC, e, para isso podemos usar os filtros de exceção que iremos abordar em outro artigo.

Pegue o código do projeto aqui: AspCoreMvc_TrataExceptions.zip

"Não pergunteis, pois, que haveis de comer, ou que haveis de beber, e não andeis inquietos."
"Porque as nações do mundo buscam todas essas coisas; mas vosso Pai sabe que precisais delas."
"Buscai antes o reino de Deus, e todas estas coisas vos serão acrescentadas."
Lucas 12:29-31

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti