У меня возникли трудности с запуском метода DELETE на моем контроллере при отправке запроса через веб-интерфейс ASP.NET. Он возвращает 404, но я не могу понять, почему. Запросы GET и POST работают должным образом, возвращая как список элементов, так и один элемент при предоставлении идентификатора, но когда я вызываю API с помощью запроса DELETE, я получаю 404 ОШИБКА.
Сценарий:
1. Приложение ASP.NET Web Forms...
Не приложение MVC, хотя я установил пакет MVC4, чтобы использовать возможности веб-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.
4. Ajax Call через JQuery для удаления элемента.
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
};
SO Я ожидаю, что карта маршрута singel должна разместить ВСЕ сценарии...
- GET api/customer - возвращает ВСЕ клиентов
- GET api/customer/5 - возвращает клиента, чей идентификатор = 5
- POST api/customer - создает новую запись клиента
- DELETE api/customer/5 - Удаляет клиента, чей идентификатор = 5
1,2 и 3 работают без проблем, просто DELET не работает. Я пробовал МНОГО Итераций и разных настроек, но безрезультатно. Я все еще чувствую, что я пропускаю что-то маленькое. Я чувствую, что проблема должна быть вокруг сопоставления Route, но я не понимаю, почему этот маршрут не будет успешно обрабатывать запрос DELETE.
Любая помощь будет принята с благодарностью.
Спасибо!
Гэри