HTTP 动词 PUT 和 DELETE:405 方法不允许 - 如何允许?
HTTP Verbs PUT and DELETE: 405 Method not allowed - how to allow?
我一直在尝试 ASP.NET 的所有建议解决方法,以便能够通过 HTTP 方法 PUT 和 DELETE 处理我的 REST Web 服务。但是,其中 none 似乎有效。 (即删除 WebDAV 处理程序或允许所有动词到 ExtensionlessHandler)。
ASP.NET Core Web API(在 IIS 上)需要什么才能允许这两个动词(HTTP PUT 和 DELETE)?
PS:我已经使用 CORS 配置了我们的 Web API 项目,但我正在从同一来源的网页访问 Web 服务。所以这也不是 CORS 问题。
一天后,我现在找到了这个错误的原因。以下原因导致了这个错误的发生:
- PUT 调用中存在拼写错误,因此未调用 Web API 方法。修复后,必须修复以下两个问题:
- 为 Web API 方法添加前缀并省略相应的属性(
[HttpPut]
、[HttpDelete]
)是不够的。因此,必须应用这些属性(这是 ASP.NET Core 特有的)。
- 仅向方法提供上述属性是不够的。还需要为这些属性 (
[HttpPut("{id}")]
、[HttpDelete("id")]
) 提供方法的地址(和查询字符串,resp.)参数。 (这是 ASP.NET Core 特有的。)
参见 。
我认为“405 Method not allowed” 相当 是一个不恰当的错误信息。上面三个原因都反映不出来,很混乱。
此外,我相信“400 Bad Request”、“404 Not Found”,或者 - 更确切地说 - “501 Not Implemented" 会更合适 HTTP return 状态。
我为此创建了一个 GitHub 问题:
"405: Method not allowed" = Misleading error message → Replace with better HTTP status code
@AxD 解释的很好。在我的情况下,问题是。
[HttpDelete("{cardioId:length(24)}")]
public async Task<IActionResult> Delete([FromBody] string cardioId)
错误地复制和粘贴代码时,我忘记将 [FromBody] 更改为 [FromRoute],这导致了这个 405 Method Not Allowed 错误,这确实是不合适的。
当您遇到此类错误时,请仔细检查此类错误。
我花了好几个小时才弄明白。我正在使用 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 放入 URL 以进行 PUT 和 DELETE。祝你好运。
如果有人像我一样脑残,请不要忘记在网络浏览器中发出 GET 请求。因此,尝试从浏览器访问您的 PUT 端点会给您带来这个问题。
您可以使用像 Postman 这样的工具。并且不要忘记在 Postman 中实际将请求类型从 GET 更改为 PUT!
我在使用 Postman 和 REST Client VSCode 扩展测试 .NET 6 RESTful Web API 时遇到了这个问题。检查我的代码后,我发现我必须将 CORS 添加到我的 Web 应用程序的管道中。这是添加 CORS 的代码:
...
builder.Services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
...
app.UseCors(options => options.AllowAnyOrigin());
编码愉快!
我一直在尝试 ASP.NET 的所有建议解决方法,以便能够通过 HTTP 方法 PUT 和 DELETE 处理我的 REST Web 服务。但是,其中 none 似乎有效。 (即删除 WebDAV 处理程序或允许所有动词到 ExtensionlessHandler)。
ASP.NET Core Web API(在 IIS 上)需要什么才能允许这两个动词(HTTP PUT 和 DELETE)?
PS:我已经使用 CORS 配置了我们的 Web API 项目,但我正在从同一来源的网页访问 Web 服务。所以这也不是 CORS 问题。
一天后,我现在找到了这个错误的原因。以下原因导致了这个错误的发生:
- PUT 调用中存在拼写错误,因此未调用 Web API 方法。修复后,必须修复以下两个问题:
- 为 Web API 方法添加前缀并省略相应的属性(
[HttpPut]
、[HttpDelete]
)是不够的。因此,必须应用这些属性(这是 ASP.NET Core 特有的)。 - 仅向方法提供上述属性是不够的。还需要为这些属性 (
[HttpPut("{id}")]
、[HttpDelete("id")]
) 提供方法的地址(和查询字符串,resp.)参数。 (这是 ASP.NET Core 特有的。)
参见
我认为“405 Method not allowed” 相当 是一个不恰当的错误信息。上面三个原因都反映不出来,很混乱。
此外,我相信“400 Bad Request”、“404 Not Found”,或者 - 更确切地说 - “501 Not Implemented" 会更合适 HTTP return 状态。
我为此创建了一个 GitHub 问题:
"405: Method not allowed" = Misleading error message → Replace with better HTTP status code
@AxD 解释的很好。在我的情况下,问题是。
[HttpDelete("{cardioId:length(24)}")]
public async Task<IActionResult> Delete([FromBody] string cardioId)
错误地复制和粘贴代码时,我忘记将 [FromBody] 更改为 [FromRoute],这导致了这个 405 Method Not Allowed 错误,这确实是不合适的。
当您遇到此类错误时,请仔细检查此类错误。
我花了好几个小时才弄明白。我正在使用 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 放入 URL 以进行 PUT 和 DELETE。祝你好运。
如果有人像我一样脑残,请不要忘记在网络浏览器中发出 GET 请求。因此,尝试从浏览器访问您的 PUT 端点会给您带来这个问题。 您可以使用像 Postman 这样的工具。并且不要忘记在 Postman 中实际将请求类型从 GET 更改为 PUT!
我在使用 Postman 和 REST Client VSCode 扩展测试 .NET 6 RESTful Web API 时遇到了这个问题。检查我的代码后,我发现我必须将 CORS 添加到我的 Web 应用程序的管道中。这是添加 CORS 的代码:
...
builder.Services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
...
app.UseCors(options => options.AllowAnyOrigin());
编码愉快!