Criando uma resposta personalizada de erro no ASP .NET WEB API com IHttpActionResult

No artigo “Criando Action Results (IHttpActionResult) personalizados no ASP .NET WEB API” aqui do blog expliquei mais detalhadamente como criar uma classe de resposta personalizada. E nesse artigo vou dar uma ideia de uma classe que se encaixa melhor no uso do dia-a-dia.

Em um exemplo mais real, podemos criar uma resposta personalizada chamada ErrorResult que retorna um HTTP status code de internal server error e um objeto de exceção contendo algumas informações padrões.

 namespace LuizPauloPradoBlog.WebApi.ActionResults
{
    public class ErrorResult : IHttpActionResult
    {
        private HttpRequestMessage _request;
        private Dictionary<string, string> _customizedException;

        public ErrorResult(HttpRequestMessage request, Exception ex)
        {
            _request = request;
            _customizedException = CreateCustomizedException(ex);
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(JsonConvert.SerializeObject(_customizedException)),
                StatusCode = HttpStatusCode.InternalServerError
            };

            return Task.FromResult(response);
        }

        private Dictionary<string, string> CreateCustomizedException(Exception ex)
        {
            var message = ex.Message;
            var innerMessage = ex.InnerException == null ? string.Empty : ex.InnerException.Message;

            var customizedException = new Dictionary<string, string>();
            customizedException.Add("Message", message);
            customizedException.Add("InnerMessage", innerMessage);

            return customizedException;
        }
    }
}

Ao chamar a resposta de ErrorResult, é passado um objeto de Exception e dentro da classe tratamos ele para somente retornar a mensagem de erro e a mensagem de erro interna. Quando o ExecuteAsync é chamado, o nosso objeto é convertido para JSON e é retornado na reposta HTTP.

Neste caso, isso é feito para não expor todo o objeto de Exception, que pode conter informações sigilosas da aplicação.

[HttpGet]
public IHttpActionResult Get(string name)
{
    try
    {
        var item = _sampleData.Single(x => x == name);
        return Ok(item);
    }
    catch (Exception ex)
    {
        return new ErrorResult(Request, ex);
    }
}

Com isso, sempre que a controller soltar uma exceção, podemos tratá-la e retornar somente as informações relevantes para o usuário.
O código completo do projeto está no GitHub, basta clicar aqui para vê-lo.
Se quiserem conhecer mais sobre mim, basta ir aqui no blog no menu quem sou e conferir também o meu LinkedIn.

Se ficou alguma dúvida, comenta aqui no blog que eu tento ajudar. 🙂

Deixe um comentário