两者的主要区别在于这一点。该异常对于立即停止处理并退出很有用。例如假设我有以下代码
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;
}
}
如果此代码运行并且我传递了一个不存在的 id,它将立即停止处理并返回状态代码 404。
相反,如果我返回 HttpResponseMessage,请求将愉快地继续其其余处理并返回 404。主要区别在于是否结束请求。
正如 Darrel 所说,在某些情况下我希望继续处理(如找到客户时)而在其他情况下我不想继续处理时,异常很有用。
您可能想要使用类似 HttpResponseMessage 的地方是在 Http POST 中返回状态代码 201 并设置位置标头。在这种情况下,我确实希望继续处理。这将与此代码有关。*
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;
}
}
*注意:如果您使用的是 beta 位,您将创建一个新的 HttpResponseMessage。我正在使用后面的位,但是这要求您使用请求之外的 CreateResponse 扩展方法。
上面,我正在创建一个响应,它将状态代码设置为 201,传入客户,然后设置位置标头。
然后返回响应并继续处理请求。
希望这可以帮助