La principal diferencia entre los dos es esto. La excepción es útil para detener el procesamiento y salir inmediatamente. Por ejemplo suponer que tengo el siguiente código
public class CustomerController : ApiController {
private ICustomerContext repo;
public CustomerController(ICustomerContext repo) {
this.repo = repo;
}
public Customer Get(int id) {
var customer = repo.Customers.SingleOrDefault(c=>c.CustomerID == id);
if (customer == null) {
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
return customer;
}
}
Si se ejecuta este código y pasar un identificador que no está presente, se detendrá inmediatamente el procesamiento y devolver un código de estado de 404.
Si en vez vuelvo HttpResponseMessage, la solicitud continuará felizmente el resto de su procesamiento y devolverá un 404. La principal diferencia es finalizar la solicitud o no.
Como dijo Darrel excepción es útil en casos en los que en algunos casos que quiero que continúe el procesamiento (como cuando se encuentra en el cliente) y en otros que no lo hacen.
El lugar donde es posible que desee utilizar algo como HttpResponseMessage está en un HTTP POST para devolver un código de estado de 201 y establecer el encabezado de ubicación. En ese caso, quiero que el procesamiento continúe. Eso haría con este código *
public class CustomerController : ApiController {
private ICustomerContext repo;
public CustomerController(ICustomerContext repo) {
this.repo = repo;
}
public HttpResponseMessage Post(Customer customer) {
repo.Add(customer);
repo.SaveChanges();
var response = Request.CreateResponse(HttpStatusCode.Created, customer);
response.Headers.Location = new Uri(Request.RequestUri, string.format("customer/{0}", customer.id));
return response;
}
}
. * Nota: Si está utilizando los bits beta, se crearía un nuevo HttpResponseMessage. Sin embargo, estoy usando las últimas partes que requieren que uses el método de extensión CreateResponse fuera de la Solicitud.
Arriba, estoy creando una respuesta que establece el código de estado en 201, pasa al cliente y luego establece el encabezado de ubicación.
continuación, se devuelve la respuesta y la petición de seguir con el procesamiento.
Esperanza esto ayuda
posible duplicado de [Lanza HttpResponseException o volver Request.CreateErrorResponse?] (Http://stackoverflow.com/questions/12519561/throw-httpresponseexception-or-return-request-createerrorresponse) –