gpt4 book ai didi

c# - HttpResponseMessage 和 HttpResponseException 有什么区别

转载 作者:IT王子 更新时间:2023-10-29 03:46:30 25 4
gpt4 key购买 nike

我试图理解两者并编写示例代码:

 public HttpResponseMessage Get()
{
var response = ControllerContext.Request
.CreateResponse(HttpStatusCode.BadRequest, "abc");

throw new HttpResponseException(response);
}

和:

 public HttpResponseMessage Get()
{
return ControllerContext.Request
.CreateResponse(HttpStatusCode.BadRequest, "abc");
}

从Fiddle上,我确实没有看出它们之间有什么区别,那么使用HttpResponseException的目的是什么?

最佳答案

两者的主要区别在于此。该异常对于立即停止处理并退出很有用。例如假设我有以下代码

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 所说,在某些情况下我希望继续处理(如找到客户时)而在其他情况下我不想继续处理的情况下,异常很有用。

您可能希望在 Http POST 中使用类似 HttpResponseMessage 的地方来返回状态代码 201 并设置位置 header 。在那种情况下,我确实希望继续处理。这段代码就可以了。*

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;
}
}

*注意:如果您使用的是测试版,您将创建一个新的 HttpResponseMessage。我正在使用后面的位,但是这需要您使用请求之外的 CreateResponse 扩展方法。

上面,我创建了一个响应,将状态代码设置为 201,传入客户,然后设置位置 header 。

然后返回响应,请求继续处理。

希望对你有帮助

关于c# - HttpResponseMessage 和 HttpResponseException 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com