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