La differenza principale tra i due è questa. L'eccezione è utile per interrompere immediatamente l'elaborazione e l'uscita. Per esempio assumere Ho il seguente codice
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;
}
}
Se questo esegue il codice e passare un id che non è presente, viene immediatamente interrotta e restituire un codice di stato 404.
Se invece torno HttpResponseMessage, la richiesta continuerà felicemente il resto della sua elaborazione e restituirà un 404. La differenza principale è che termina la richiesta o meno.
Come ha detto Darrel, l'eccezione è utile nei casi in cui in alcuni casi voglio che l'elaborazione continui (come quando il cliente viene trovato) e in altri no.
Il luogo in cui è possibile utilizzare qualcosa come HttpResponseMessage si trova in un Http POST per restituire un codice di stato di 201 e impostare l'intestazione della posizione. In tal caso, desidero che l'elaborazione continui. Ciò farebbe con questo codice *
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:. Se si utilizzano i bit beta è necessario creare un nuovo HttpResponseMessage. Sto usando i bit successivi che tuttavia richiedono l'utilizzo del metodo di estensione CreateResponse al di fuori della richiesta.
Sopra, sto creando una risposta che imposta il codice di stato su 201, passa nel cliente e quindi imposta l'intestazione della posizione.
La risposta viene quindi restituita e la richiesta continua l'elaborazione.
Spero che questo aiuti
fonte
2012-05-24 09:18:00
possibile duplicato del [Gettare HttpResponseException o tornare Request.CreateErrorResponse?] (Http://stackoverflow.com/questions/12519561/throw-httpresponseexception-or-return-request-createerrorresponse) –