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

ohfgkhjo  于 2022-11-12  发布在  其他
关注(0)|答案(5)|浏览(344)

我已经尝试了所有建议的解决方法,使ASP.NET能够通过HTTP方法PUT和DELETE来处理我的REST Web服务。但是,它们似乎都不起作用。(即,删除WebDAV处理程序或允许所有动词使用ExtensionlessHandler)。
在ASP.NET核心Web API(在IIS上)中需要什么来允许这两个动词(HTTPPUT和DELETE)?
PS:我已经使用CORS配置了我们的Web API项目,但是我正在从同一个源的网页访问Web服务。所以这也不是CORS的问题。

t30tvxxf

t30tvxxf1#

一天后,我现在找到了这个错误的原因。以下原因导致了这个错误的发生:
1.在PUT调用中有一个打字错误,因此Web API方法没有被调用。在修复了这个问题之后,必须修复以下两个问题:
1.仅仅用方法作为Web API方法的前缀并省略相应的属性([HttpPut][HttpDelete])是不够的,因此,必须应用这些属性(这是ASP.NETCore特有的)。
1.仅为方法提供上述属性是不够的。还需要为这些属性([HttpPut("{id}")][HttpDelete("{id}")])提供方法的地址(和查询字符串)参数。(这是ASP.NETCore所特有的。)
请参阅ASP.NET Core Web API: Routing by method name?
我认为“405 Method not allowed”是一个非常不恰当的错误消息。它没有反映上述三个原因中的任何一个,并且非常混乱。
此外,我相信“400错误请求"、“404未找到"或者--更确切地说--“501未实现”应该是更合适的HTTP返回状态。
我在GitHub上创建了一个问题:
[“405:不允许的方法”=误导性错误消息→替换为更好的HTTP状态代码][1]

5lwkijsr

5lwkijsr2#

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

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

注意,您必须在URL中输入id才能执行PUT和DELETE操作。祝您好运。

qyswt5oh

qyswt5oh3#

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

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

在复制和粘贴代码时,我错误地忘记将[FromBody]更改为[FromRoute],这导致了405 Method Not Allowed错误,这确实是不适当的。
当你遇到这种错误时,请仔细检查这种错误。

r3i60tvu

r3i60tvu4#

如果有人像我一样脑子有问题,不要忘记在浏览器中你是在发出GET请求。所以试图从浏览器访问PUT端点会给你带来这个问题。你可以使用像Postman这样的工具。而且不要忘记在Postman中把请求类型从GET改为PUT!

y1aodyip

y1aodyip5#

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

祝您编码愉快!

相关问题