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

8

我一直在尝试所有针对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> - AxD
你是否在相应的操作上添加了[HttpPut]/[HttpDelete]属性?默认情况下,操作只接受GET请求(也许还有POST请求-我不确定)。 - Chris Pratt
5个回答

11
一天后,我找到了这个错误的原因。以下原因导致了这个错误的发生:
  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**”是一条非常不恰当的错误消息。它没有反映出上述三个原因中的任何一个,而且非常令人困惑。

此外,我认为更适合的HTTP返回状态码可能是“400 Bad Request”,“404 Not Found”,或者更好的是“501 Not Implemented”。


我创建了一个GitHub问题:
"405: Method not allowed" = 误导性的错误信息 → 用更好的HTTP状态码替换。

2
您的HTTP Delete中使用了错误的括号,应该使用{}。 - Eru
你能展示一下你使用的删除属性吗?我遇到了一个问题,当我使用 [HttpDelete("{code}")] 时会得到相同的错误信息,但是使用 [HttpDelete] 却不会。 - lcj
你最好在StackOverflow上创建一个新的问题,并添加一个包含整个函数声明(包括属性)的代码片段。 - AxD

5

我花了几个小时才明白这个问题。我正在使用ASP.NET Core 5,不需要修改web.config文件来删除WebDav等内容。我认为大多数人没有意识到POST方法和PUT、DELETE方法的参数签名之间的差异。

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

请注意,对于PUT和DELETE方法,您必须在URL中放置id参数。祝好运。


2

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

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

在复制和粘贴代码时,我不小心忘记将[FromBody]更改为[FromRoute],导致出现 405方法不允许错误,这真的很不恰当。

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


1
如果有人和我一样会犯傻,不要忘记在Web浏览器中你正在进行一个GET请求。因此,试图从浏览器访问PUT终端点将导致此问题。您可以使用像Postman这样的工具。并且不要忘记在Postman中实际更改请求类型从GET到PUT!

0
我在使用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());

祝你编程愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接