【问题标题】:HTTP Verbs PUT and DELETE: 405 Method not allowed - how to allow?HTTP 动词 PUT 和 DELETE:405 方法不允许 - 如何允许?
【发布时间】:2019-10-28 03:54:58
【问题描述】:

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

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

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

【问题讨论】:

  • 默认情况下已经存在:<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <system.webServer>
  • 您是否将[HttpPut]/[HttpDelete] 属性添加到相应的操作中?默认情况下,操作只接受 GET(可能还有 POST - 我不确定)。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        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: Routing by method name?


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

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


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

        【讨论】:

        • 你有错误的 HTTP 删除括号,应该是 {}
        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多