在通过ASP.NET Web API提交请求时,我很难在我的Controller上获取DELETE方法。它返回404,但我无法弄清楚原因。 GET& POST请求按预期工作,返回项目列表以及提供id时的单个项目,但是当我使用DELETE请求调用API时,我得到404错误。
情景:
虽然我已经安装了MVC4软件包以利用Web API功能,但它不是MVC应用程序。
RouteTable.Routes.MapHttpRoute(
"Default",
"api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
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路线图应该适应所有场景......
1,2&amp; 3工作没有问题,只是DELET不起作用。我尝试了许多迭代和不同的调整,但无济于事。然而,我仍然觉得我忽视了一些小事。我觉得问题必须围绕路由映射,但我不明白为什么这条路由不会成功处理DELETE请求。
非常感谢任何帮助。
谢谢!
加里
答案 0 :(得分:27)
您是否在web.config中定义了此内容?
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
答案 1 :(得分:-1)
尝试在删除方法上返回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 );
}
答案 2 :(得分:-3)
您需要在Controller中实现Delete方法:
// DELETE /api/values/5
public void Delete(int id) {}