La principale différence entre les deux est la suivante. L'exception est utile pour arrêter immédiatement le traitement et sortir. Par exemple, supposons que j'ai le code suivant
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 ce code s'exécute et que je passe un identifiant qui n'est pas présent, il arrêtera immédiatement le traitement et renverra un code d'état 404.
Si, à la place, je renvoie HttpResponseMessage, la requête poursuivra joyeusement le reste de son traitement et renverra un 404. La principale différence étant de terminer la demande ou non.
Comme l'a dit Darrel, l'exception est utile dans les cas où, dans certains cas, je veux que le traitement continue (comme lorsque le client est trouvé) et dans d'autres, je ne le veux pas.
L'endroit où vous pourriez vouloir utiliser quelque chose comme HttpResponseMessage est dans un Http POST pour renvoyer un code d'état 201 et définir l'en-tête d'emplacement. Dans ce cas, je veux que le traitement se poursuive. Pour ce faire, il suffit d'utiliser ce code.
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;
}
}
*Note : Si vous utilisez les versions bêta, vous devez créer un nouveau HttpResponseMessage. J'utilise les versions ultérieures qui requièrent l'utilisation de la méthode d'extension CreateResponse à partir de la requête.
Ci-dessus, je crée une réponse qui définit le code d'état 201, transmet le client, puis définit l'en-tête d'emplacement.
La réponse est ensuite renvoyée et le traitement de la demande se poursuit.
J'espère que cela vous aidera
0 votes
Duplication possible de Lancer HttpResponseException ou retourner Request.CreateErrorResponse ?