DELETE命令未访问WebAPI控制器

在通过ASP.NET Web API提交请求时,我很难在我的Controller上获取DELETE方法。 它返回404,但我无法弄清楚原因。 GET和POST请求按预期工作,返回项目列表以及提供id时的单个项目,但是当我使用DELETE请求调用API时,我得到404错误。

场景:

1. ASP.NET Web窗体应用程序……

虽然我已经安装了MVC4软件包以利用Web APIfunction,但它不是MVC应用程序。

2. global.asax中的路由表定义

RouteTable.Routes.MapHttpRoute( "Default", "api/{controller}/{id}", new { id = RouteParameter.Optional } ); 

3.控制器定义

  public HttpResponseMessage Post(Customer customer) { CustomerDb.Customers.AddObject(customer); CustomerDb.SaveChanges(); var response = new HttpResponseMessage(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 Get() { IQueryable custs = CustomerDb.Customers.AsQueryable(); List dto = new List(); 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,所以我没有把这些反应与REAL问题混淆。 显然,在一个真正的实现中,没有客户会返回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 }; 

所以我希望singel路线图应该适应所有场景……

  1. GET api / customer – 返回所有客户
  2. GET api / customer / 5 – 返回ID = 5的客户
  3. POST api / customer – 创建新的客户记录
  4. DELETE api / customer / 5 – 删除ID = 5的客户

1,2和3工作没有问题,只是DELET不起作用。 我尝试了许多迭代和不同的调整,但无济于事。 然而我仍然觉得我忽视了一些小事。 我觉得问题必须围绕路由映射,但我不明白为什么这条路由不会成功处理DELETE请求。

任何帮助将不胜感激。

谢谢!

加里

你在web.config中定义了这个吗?

      

尝试在Delete方法上返回HttpResponseMessage

 public HttpResponseMessage Delete( string id ) { Customer cust = CustomerDb.Customers.Where(c => c.id == id).SingleOrDefault(); if (cust == null) return new HttpResponseException( HttpStatusCode.NotFound ); // using NotFound rather than bad request CustomerDb.Customers.DeleteObject(cust); CustomerDb.SaveChanges(); return new HttpResponseMessage( HttpStatusCode.NoContent ); } 

您需要在Controller中实现Delete方法:

 // DELETE /api/values/5 public void Delete(int id) {}