我已经尝试了所有建议的解决方法,使ASP.NET能够通过HTTP方法PUT和DELETE来处理我的REST Web服务。但是,它们似乎都不起作用。(即,删除WebDAV处理程序或允许所有动词使用ExtensionlessHandler)。在ASP.NET核心Web API(在IIS上)中需要什么来允许这两个动词(HTTPPUT和DELETE)?PS:我已经使用CORS配置了我们的Web API项目,但是我正在从同一个源的网页访问Web服务。所以这也不是CORS的问题。
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]
[HttpPut]
[HttpDelete]
[HttpPut("{id}")]
[HttpDelete("{id}")]
5lwkijsr2#
这花了我几个小时才弄明白。我使用的是ASP.NET Core 5,不需要修改web.config来删除WebDav或任何东西。我相信大多数人都没有意识到POST方法和PUT,DELETE方法的签名的区别。
http://servername/api/controller
http://servername/api/controller/id
注意,您必须在URL中输入id才能执行PUT和DELETE操作。祝您好运。
qyswt5oh3#
@AxD解释得很好。在我的情况下,以下是问题所在。
[HttpDelete("{cardioId:length(24)}")] public async Task<IActionResult> Delete([FromBody] string cardioId)
在复制和粘贴代码时,我错误地忘记将[FromBody]更改为[FromRoute],这导致了405 Method Not Allowed错误,这确实是不适当的。当你遇到这种错误时,请仔细检查这种错误。
r3i60tvu4#
如果有人像我一样脑子有问题,不要忘记在浏览器中你是在发出GET请求。所以试图从浏览器访问PUT端点会给你带来这个问题。你可以使用像Postman这样的工具。而且不要忘记在Postman中把请求类型从GET改为PUT!
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());
祝您编码愉快!
5条答案
按热度按时间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]
5lwkijsr2#
这花了我几个小时才弄明白。我使用的是ASP.NET Core 5,不需要修改web.config来删除WebDav或任何东西。我相信大多数人都没有意识到POST方法和PUT,DELETE方法的签名的区别。
http://servername/api/controller
http://servername/api/controller/id
个注意,您必须在URL中输入id才能执行PUT和DELETE操作。祝您好运。
qyswt5oh3#
@AxD解释得很好。在我的情况下,以下是问题所在。
在复制和粘贴代码时,我错误地忘记将[FromBody]更改为[FromRoute],这导致了405 Method Not Allowed错误,这确实是不适当的。
当你遇到这种错误时,请仔细检查这种错误。
r3i60tvu4#
如果有人像我一样脑子有问题,不要忘记在浏览器中你是在发出GET请求。所以试图从浏览器访问PUT端点会给你带来这个问题。你可以使用像Postman这样的工具。而且不要忘记在Postman中把请求类型从GET改为PUT!
y1aodyip5#
我在使用Postman和REST Client VSCode扩展测试.NET 6 RESTful Web API时遇到了这个问题。检查代码后,我发现我必须将CORS添加到Web应用程序的管道中。以下是添加CORS的代码:
祝您编码愉快!