“DELETE”类型的 Http 请求在 WebAPI 中不起作用?

Posted

技术标签:

【中文标题】“DELETE”类型的 Http 请求在 WebAPI 中不起作用?【英文标题】:The "DELETE" type of Http request does not work in WebAPI? 【发布时间】:2013-05-12 05:04:47 【问题描述】:

我的 WebAPI 项目中有 GET、PUT、POST 工作。 我正在做的最后一个 Http 请求是 DELeTE,但它不起作用。

我已经阅读了这里以及其他网站的许多帖子,但没有一个。例如

WebAPI Controller is not being reached on DELETE command

WebAPI Delete not working - 405 Method Not Allowed

ASP.Net WebAPI Delete verb not working

ASP.NET Web API - PUT & DELETE Verbs Not Allowed - IIS 8

http://social.msdn.microsoft.com/Forums/en-US/windowsazuredevelopment/thread/8906fd7e-a60b-484e-be63-9574b9fca44a/

等等……

有什么解决方法吗?

请帮忙,谢谢。

更新:

我的后端代码:

         [HttpDelete]
    public HttpResponseMessage Delete(int divisionID)
    
        if (divisionID != default(int))
        
            var found = dc.MedicareLocalAccounts.SingleOrDefault(m => m.DivisionID == divisionID);

            if (found == null)
            
                return new HttpResponseMessage(HttpStatusCode.NotFound);
            

            dc.MedicareLocalAccounts.Remove(found);

            dc.SaveChanges();

            return new HttpResponseMessage(HttpStatusCode.OK);
        

        return new HttpResponseMessage(HttpStatusCode.NotFound);
    

现在,如果我将参数类型从 int 更改为任何类,比如 Division

Delete(Division d)

     int divisionID = d.DivisionID;
     //....the rest is same

这样就可以了。

但我只是不想输入整个对象作为参数来使 DELETE 方法工作,因为它不是必需的。

那么您还有其他更好的解决方案吗?

【问题讨论】:

您要链接的问题似乎有已被接受的答案。因此,“似乎是 Microsoft 代码问题”似乎是不正确的(因为问题的提问者现在显然已经成功),并且“是否有任何解决方法”似乎只是要求重新发布这些答案。 “这似乎是 Microsoft 代码问题” - 不。你认为他们忘记实施删除了吗?这很可能是您的代码中的错误,您没有显示。 你的实现和配置是什么 @Damien_The_Unbeliever 我之所以说这是微软的问题,是因为我在那些链接中看到了一些解决方案,建议修改系统配置文件。现在我解决了我的问题,请看我的问题。 @CodeCaster 您好,请参阅我对 Damien 的回复,了解为什么我认为这是 Microsoft 问题。 【参考方案1】:

Web API 处理简单参数类型 (int) 与处理复杂类型(类)不同。默认情况下,简单参数取自请求 URI,复杂类型取自请求正文。

在您的第一个示例中,参数名称是“divisionID”——这与您的路由变量匹配吗?默认的 Web API 路由是“api/controller/id”,所以参数应该命名为“id”。

【讨论】:

简单直接的问题。谢谢 !!!我不知道连名字都应该符合 WebAPI 路由约定。【参考方案2】:

一种解决方法是使用 AttributeRouting 库。这是 WebAPI 的扩展,可以从 nuget 下载。使用 AttributeRouting 库,您可以例如使用 HttpGet 实现一个将执行删除的函数

[GET("delete/id"]
function DeleteThis(int id)

...

【讨论】:

嗨,雷蒙德,感谢您的回复。我想尝试将其作为最后的解决方案,因为我不想通过使用其他库来使其工作。

以上是关于“DELETE”类型的 Http 请求在 WebAPI 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在web前端怎么发送http协议的put delete请求

HTTP协议的8种请求类型

http请求方式和传递数据类型

在设计API时坚持适当的HTTP请求类型有多重要?

如何在 HttpURLConnection 中发送 PUT、DELETE HTTP 请求?

http面试问题集锦