7

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

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

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

4

4 回答 4

10

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

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

请参阅ASP.NET Core Web API:按方法名称路由?.


我相信“ 405 Method not allowed ”是一个非常不恰当的错误信息。它没有反映上述三个原因中的任何一个,并且非常令人困惑。

此外,我相信“ 400 Bad Request ”、“ 404 Not Found ”,或者——更确切地说——“ 501 Not Implemented ”会是更合适的 HTTP 返回状态。


我在此创建了一个 GitHub 问题:
“405: Method not allowed” = 误导性错误消息 → 替换为更好的 HTTP 状态代码

于 2019-06-16T09:54:51.183 回答
5

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

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

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

于 2021-01-21T18:00:41.680 回答
2

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

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

错误地复制和粘贴代码时我忘记将 [FromBody] 更改为 [FromRoute] 导致此405 Method Not Allowed错误,这确实不合适。

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

于 2020-07-26T13:56:04.937 回答
1

如果有人像我一样放屁,请不要忘记在网络浏览器中您正在发出 GET 请求。因此,尝试从浏览器访问您的 PUT 端点会给您带来这个问题。您可以使用 Postman 之类的工具。并且不要忘记在 Postman 中将请求类型从 GET 实际更改为 PUT!

于 2021-08-19T16:44:20.643 回答