Rest HTTP谓词放置和删除:不允许405方法-如何允许?

Rest HTTP谓词放置和删除:不允许405方法-如何允许?,rest,iis,asp.net-core,kestrel-http-server,Rest,Iis,Asp.net Core,Kestrel Http Server,我一直在尝试ASP.NET所有建议的解决方法,以便能够通过HTTP方法PUT和DELETE来解决REST web服务。然而,它们似乎都不起作用。(即删除WebDAV处理程序或允许所有动词都使用ExtensionlessHandler) ASP.NET核心Web API(在IIS上)中需要什么来允许这两个动词(HTTP PUT和DELETE) PS:我已经使用CORS配置了我们的Web API项目,但是我正在从同一来源的网页访问Web服务。所以这也不是CORS的问题。一天后,我找到了这个错误的原因

我一直在尝试ASP.NET所有建议的解决方法,以便能够通过HTTP方法PUT和DELETE来解决REST web服务。然而,它们似乎都不起作用。(即删除WebDAV处理程序或允许所有动词都使用ExtensionlessHandler)

ASP.NET核心Web API(在IIS上)中需要什么来允许这两个动词(HTTP PUT和DELETE)


PS:我已经使用CORS配置了我们的Web API项目,但是我正在从同一来源的网页访问Web服务。所以这也不是CORS的问题。

一天后,我找到了这个错误的原因。发生此错误的原因如下:

  • PUT调用中有一个输入错误,因此没有调用WebAPI方法。修复后,必须修复以下两个问题:
  • 在Web API方法前面加上方法前缀并省略相应的属性是不够的(
    [HttpPut]
    [HttpDelete]
    )。因此,必须应用这些属性(这是ASP.NET核心所特有的)
  • 仅为方法提供上述属性是不够的。它还需要为这些属性(
    [HttpPut({id}”)]
    [HttpDelete(“id”)]
    )提供方法的地址(以及查询字符串等)参数。(这是ASP.NET核心所特有的)

  • 我认为“405方法不允许””是一条非常不恰当的错误消息。它没有反映上述三个原因中的任何一个,并且非常令人困惑

    一、 此外,相信“400错误请求””、“404未找到””,或者-更确切地说-“501未实现””将是更合适的HTTP返回状态


    我为此创建了一个GitHub问题:

    @AxD解释得很好。在我的情况下,以下是问题

    [HttpDelete("{cardioId:length(24)}")]
    public async Task<IActionResult> Delete([FromBody] string cardioId)
    
    [HttpDelete(“{cardioId:length(24)}”)]
    公共异步任务删除([FromBody]字符串心形)
    
    在复制和粘贴代码时,我错误地忘记将[FromBody]更改为[FromRoute],这导致了不允许使用此405方法的错误,这是非常不合适的


    当您遇到此类错误时,请仔细检查此类错误。

    我花了几个小时才弄清楚。我使用的是ASP.NET Core 5,不需要修改web.config来删除WebDav或任何东西。我相信大多数人没有意识到POST方法和PUT、DELETE方法签名的区别

    • POST方法URL:
      http://servername/api/controller
    • 放置和删除方法URL:
      http://servername/api/controller/id

    请注意,您必须在URL中输入id,才能进行放置和删除。祝您好运。

    默认情况下已经存在:
    您是否将
    [HttpPut]
    /
    [HttpDelete]
    属性添加到相应的操作中?默认情况下,操作只接受GET(可能是POST-not-sure off-of-the-the-head)。HTTP Delete的括号错误,应该是{}