Контроллер WebAPI не доступен по команде DELETE - PullRequest
19 голосов
/ 14 марта 2012

У меня возникают проблемы при запуске метода DELETE на моем контроллере при отправке запроса через ASP.NET Web API.Он возвращает 404, но я не могу понять, почему.Запросы GET & POST работают, как и ожидалось, возвращая как список элементов, так и один элемент при наличии идентификатора, но когда я вызываю API с помощью запроса DELETE, я получаю сообщение об ошибке 404.

Сценарий:

1.Приложение ASP.NET Web Forms ...

Не приложение 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, когда клиент не может быть найден, поэтому я не путаю эти ответы с РЕАЛЬНОЙ проблемой.Очевидно, что в реальной реализации ни один клиент не вернет ошибку 404.

4.Ajax Позвоните через 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
    };

ТАК Я ожидаю, что карта маршрутов сингла должна соответствовать ВСЕМ сценариям ...

  1. GET api / customer - ReturnsВСЕ клиенты
  2. GET api / customer / 5 - возвращает клиента, чей идентификатор = 5
  3. POST api / customer - создает новую запись клиента
  4. DELETE api / customer/ 5 - удаляет клиента, чей ID = 5

1,2 & 3 работает без проблем, просто DELET не работает.Я пробовал МНОГИЕ итерации и различные настройки, но безрезультатно.Я все еще чувствую, однако, что я пропускаю что-то маленькое.Я чувствую, что проблема должна быть связана с отображением маршрута, но я не понимаю, почему этот маршрут не смог бы успешно обработать запрос DELETE.

Любая помощь будет принята с благодарностью.

Спасибо!

Гари

Ответы [ 3 ]

27 голосов
/ 14 марта 2012

Есть ли у вас это определено в вашем web.config?

   <system.webServer>
          <modules runAllManagedModulesForAllRequests="true">
          </modules>
    </system.webServer>
0 голосов
/ 17 марта 2012

Попробуйте вернуть 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 );
}
0 голосов
/ 14 марта 2012

Вам необходимо реализовать метод Delete в контроллере:

// DELETE /api/values/5
public void Delete(int id) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...