【问题标题】:WebAPI Controller is not being reached on DELETE command在 DELETE 命令上未到达 WebAPI 控制器
【发布时间】:2012-03-30 08:45:12
【问题描述】:

当通过 ASP.NET Web API 提交请求时,我很难让控制器上的 DELETE 方法触发。它返回 404 但我不知道为什么。 GET 和 POST 请求按预期工作,在提供 id 时返回项目列表和单个项目,但是当我使用 DELETE 请求调用 API 时,我收到 404 错误。

场景:

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

虽然我安装了 MVC4 包以利用 Web API 功能,但不是 MVC 应用程序。

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。通过 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
    };

所以我希望单个路线图应该适应所有场景......

  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 请求。

任何帮助将不胜感激。

谢谢!

加里

【问题讨论】:

    标签: jquery httprequest asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    你的 web.config 中是否定义了这个?

       <system.webServer>
              <modules runAllManagedModulesForAllRequests="true">
              </modules>
        </system.webServer>
    

    【讨论】:

    • 回答你的问题......不,我没有......但我应该有!现在像魅力一样工作!非常感谢!我得查一下,看看它有什么不同。这是我第一次听说。
    • 嗯...我做了一些研究,偶然发现了这篇文章,建议不要使用这种技术。它也提供了一种解决方法。可能值得一看。 britishdeveloper.co.uk/2010/06/…
    • 无缘无故得到 404,这也为我解决了问题。
    • 啊,刚刚阅读了上面的@GaryO.Stenstrom 评论。将 webconfig 更改为使用 代替。工作。
    • 这个 SO 答案也以与现有 web.config 条目类似的方式解决了问题:stackoverflow.com/questions/10906411/…
    【解决方案2】:

    尝试在您的 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 );
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 对不起,我没有看到全文。
      猜你喜欢
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多