DELETE命令未访问WebAPI控制器

Gar*_*rom 19 jquery httprequest asp.net-mvc-4 asp.net-web-api

在通过ASP.NET Web API提交请求时,我很难在我的Controller上获取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 } 
            );
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

我有一些方法抛出BadRequest错误而不是404当客户无法找到时所以我不会将这些回复与REAL问题混淆.显然,在真正的实现中,没有客户会返回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
    };
Run Code Online (Sandbox Code Playgroud)

所以我期待singel路线图应该适应所有场景......

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

任何帮助将不胜感激.

谢谢!

加里

小智 27

你在web.config中定义了这个吗?

   <system.webServer>
          <modules runAllManagedModulesForAllRequests="true">
          </modules>
    </system.webServer>
Run Code Online (Sandbox Code Playgroud)

  • 嗯......我做了一点研究,偶然发现了这篇文章,建议不要使用这种技术.它也提供了一种解决方法.可能值得一看.http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html (10认同)
  • 啊,刚看完上面的@ GaryO.Stenstrom评论.更改了webconfig以使用<remove name ="UrlRoutingModule-4.0"/> <add name ="UrlRoutingModule-4.0"type ="System.Web.Routing.UrlRoutingModule"preCondition =""/>.工作. (2认同)