Główna różnica między tymi dwoma jest taka. Wyjątek jest przydatny do natychmiastowego przerwania przetwarzania i zakończenia. Na przykład założyć, mam następujący kod
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;
}
}
Jeśli ten kod działa i mogę przekazać identyfikator, który nie jest obecny, będzie natychmiast zatrzymać przetwarzanie i zwraca kod statusu 404.
Jeśli zamiast wrócić HttpResponseMessage, żądanie z przyjemnością kontynuuje pozostałą część przetwarzania i zwraca 404. Główną różnicą jest zakończenie żądania lub nie.
Jak Darrel powiedział, że wyjątek jest przydatny w przypadkach, w których w niektórych przypadkach chcę kontynuować przetwarzanie (jak w przypadku znalezienia klienta), aw innych nie.
Miejsce, w którym możesz chcieć użyć czegoś takiego jak HttpResponseMessage, znajduje się w HST POST, aby zwrócić kod stanu 201 i ustawić nagłówek lokalizacji. W takim przypadku chcę, aby przetwarzanie było kontynuowane. Że zrobi z tym kodem *
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;
}
}
*. Uwaga: Jeżeli używasz bity beta chcesz utworzyć nowy HttpResponseMessage. Używam późniejszych bitów, które jednak wymagają użycia metody rozszerzenia CreateResponse z Żądania.
Powyżej tworzę odpowiedź, która ustawia kod statusu na 201, przechodzi w kliencie, a następnie ustawia nagłówek lokalizacji.
Odpowiedź jest zwracana, a żądanie kontynuuje przetwarzanie.
Nadzieja to pomaga
możliwe duplikat [Rzut HttpResponseException lub powrót Request.CreateErrorResponse?] (Http://stackoverflow.com/questions/12519561/throw-httpresponseexception-or-return-request-createerrorresponse) –