HTTP动词PUT和DELETE:405方法不允许-如何允许?

时间:2019-06-13 14:11:45

标签: rest iis asp.net-core kestrel-http-server

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

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

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

3 个答案:

答案 0 :(得分:2)

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

  • POST 方法网址:http://servername/api/controller
  • PUT 和 DELETE 方法网址:http://servername/api/controller/id

请注意,您必须将 id 放在 PUT 和 DELETE 的 URL 中。祝你好运。

答案 1 :(得分:0)

一天后,我现在找到了导致此错误的原因。以下原因导致此错误发生:

  1. PUT调用中有错别字,因此未调用Web API方法。解决此问题后,必须解决以下两个问题:
  2. 仅用该方法为Web API方法添加前缀并省略相应的属性([HttpPut][HttpDelete])是不够的。因此,必须应用这些属性(这是ASP.NET Core 所特有的)。
  3. 仅将上述属性提供给方法是不够的。还需要为这些属性([HttpPut("{id}")][HttpDelete("id")])提供方法的地址(和查询字符串,分别)参数。 (这是ASP.NET 核心所特有的。)

请参见ASP.NET Core Web API: Routing by method name?


我相信“ 405方法不允许相当是不适当的错误消息。它没有反映出以上三个原因中的任何一个,并且非常令人困惑。

此外,我相信“ 400错误的请求”,“未找到 404 ”或-而是“未实现 501 “本来是更合适的HTTP返回状态。


我为此创建了一个GitHub问题:
"405: Method not allowed" = Misleading error message → Replace with better HTTP status code

答案 2 :(得分:0)

@AxD解释得很好。就我而言,以下是问题所在。

[HttpDelete("{cardioId:length(24)}")]
public async Task<IActionResult> Delete([FromBody] string cardioId)

错误地在复制和粘贴代码时,我忘记将[FromBody]更改为[FromRoute],这导致此 405不允许使用方法错误,这确实不合适。

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