当我通过ASP.NET Web API提交请求时,我的控制器上的DELETE方法难以触发。它返回一个404,但我不知道为什么。 GET& POST请求按预期工作,在提供id时返回项目列表以及单个项目,但是当我使用DELETE请求调用API时,会收到404错误。
场景:
ASP.NET Web窗体应用程序…
不是MVC应用程序,尽管我已经安装了MVC4软件包,以利用Web API功能。
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,当一个客户不能被发现,所以我没有得到这些回应与REAL问题混淆。显然,在一个真正的实现中,没有客户会返回404错误。
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路线图应该适应所有的情况…
GET api / customer – 返回所有客户
> GET api / customer / 5 – 返回ID = 5的客户
> POST api / customer – 创建一个新的客户记录
> DELETE api / customer / 5 – 删除ID = 5的客户
1,2& 3工作没有问题,只是DELET不起作用。我已经尝试了很多迭代和不同的调整,没有用。我仍然觉得我忽略了一些小事情。我觉得这个问题必须围绕着Route映射,但是我不明白为什么这个路由不能成功地处理DELETE请求。
任何帮助将不胜感激。
谢谢!
加里
解决方法
你在web.config中有这个定义吗?
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> </modules> </system.webServer>