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. 🙂

Criando Action Results (IHttpActionResult) personalizados no ASP .NET WEB API

Neste artigo vou explicar como criar um Action Result, herdado da interface IHttpActionResult , no ASP .NET WEB API.

De modo geral, a interface IHttpActionResult representa a criação de repostas HTTP na nossa controller. Ela basicamente representa uma factory de respotas HTTP usando HttpResponseMessage.

Quem quiser mais detalhes, aqui no blog tem o post para entender a diferença entre os Action Results IHttpActionResult e HttpResponseMessage que explica o assunto.

No trecho de código abaixo temos dois exemplos de tipos de respostas IHttpActionResult que geralmente são usados em métodos de controllers.

[HttpGet]
public IHttpActionResult Get()
{
    if (_sampleData == null)
        return NotFound();

    return Ok();
}

O Ok() representa uma resposta HTTP que se refere a um status code de OK. Já a resposta NotFound(), representa uma resposta  HTTP que se refere a um status code de not found.

Para criar uma resposta personalizada, precisamos criar uma classe que implemente a interface IHttpActionResult e tenha um método chamado ExecuteAsync.

namespace System.Web.Http
{
    public interface IHttpActionResult
    {
        Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
    }
}

O método ExecuteAsync é chamado para criar um objeto  HttpResponseMessage, que representa uma reposta HTTP dentro da nossa aplicação. Nele é possível usar todas as funções desta classe e manipular a resposta a ser criada. O retorno do método é uma Task, que quando executada, vai conter o objeto de resposta HTTP.

Para entender melhor como tudo funciona, vamos criar uma resposta de exemplo.

namespace LuizPauloPradoBlog.WebApi.ActionResults
{
    public class SampleResult : IHttpActionResult
    {
        private string _message;

        public SampleResult()
        {
            _message = "OK " + DateTime.Now.ToShortDateString();
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(_message)
            };

            return Task.FromResult(response);
        }
    }
}

No exemplo acima foi criada uma resposta chamada SampleResponse que retorna sempre uma mensagem de OK com a data atual.

[HttpGet]
public IHttpActionResult Get()
{
    return new SampleResult();
}

Ao instanciar nosso SampleResult na controller, a classe irá internamente criar uma mensagem e executar o ExecuteAsync para criar a resposta HTTP.

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. 🙂