【发布时间】:2012-03-30 08:45:12
【问题描述】:
当通过 ASP.NET Web API 提交请求时,我很难让控制器上的 DELETE 方法触发。它返回 404 但我不知道为什么。 GET 和 POST 请求按预期工作,在提供 id 时返回项目列表和单个项目,但是当我使用 DELETE 请求调用 API 时,我收到 404 错误。
场景:
1。 ASP.NET Web 窗体应用程序...
虽然我安装了 MVC4 包以利用 Web API 功能,但不是 MVC 应用程序。
2。 global.asax 中的路由表定义
RouteTable.Routes.MapHttpRoute(
"Default",
"api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
3。控制器定义
public HttpResponseMessage<Customer> Post(Customer customer)
{
CustomerDb.Customers.AddObject(customer);
CustomerDb.SaveChanges();
var response = new HttpResponseMessage<Customer>(customer, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/Customer/"+customer.id.ToString());
return response;
}
public CustomerDTO Get(int id)
{
CustomerDTO custDTO = null;
Customer cust = CustomerDb.Customers.Where(c => c.id == id).SingleOrDefault();
if (cust == null)
throw new HttpResponseException(HttpStatusCode.BadRequest);
else
custDTO = new CustomerDTO(cust);
return custDTO;
}
public IEnumerable<CustomerDTO> Get()
{
IQueryable<Customer> custs = CustomerDb.Customers.AsQueryable();
List<CustomerDTO> dto = new List<CustomerDTO>();
foreach (Customer cust in custs)
{
dto.Add(new CustomerDTO(cust));
}
return dto;
}
public Customer Delete(int id)
{
Customer cust = CustomerDb.Customers.Where(c => c.id == id).SingleOrDefault();
if (cust == null)
throw new HttpResponseException(HttpStatusCode.BadRequest);
CustomerDb.Customers.DeleteObject(cust);
CustomerDb.SaveChanges();
return (cust);
}
当找不到客户时,我有一些方法会抛出 BadRequest 错误而不是 404,因此我不会将这些响应与真正的问题混淆。显然,在实际实现中,没有客户会返回 404 错误。
4。通过 JQuery 调用 Ajax 来删除项目。
function deleteCustomer(id) {
var apiUrl = "/api/customer/{0}";
apiUrl = apiUrl.replace("{0}", id);
$.ajax({
url: apiUrl,
type: 'DELETE',
cache: false,
statusCode: {
200: function (data) {
}, // Successful DELETE
404: function (data) {
alert(apiUrl + " ... Not Found");
}, // 404 Not Found
400: function (data) {
alert("Bad Request O");
} // 400 Bad Request
} // statusCode
}); // ajax call
};
所以我希望单个路线图应该适应所有场景......
- GET api/customer -- 返回所有客户
- GET api/customer/5 -- 返回 ID = 5 的客户
- POST api/customer -- 创建新的客户记录
- DELETE api/customer/5 -- 删除 ID = 5 的客户
1,2 & 3 没有问题,只是 DELET 不起作用。我尝试了许多迭代和不同的调整,但无济于事。然而,我仍然觉得我忽略了一些小事。我觉得问题一定出在路由映射上,但我不明白为什么这条路由不能成功处理 DELETE 请求。
任何帮助将不胜感激。
谢谢!
加里
【问题讨论】:
标签: jquery httprequest asp.net-mvc-4 asp.net-web-api