我一直在尝试ASP.NET的所有建议的解决方法,以便能够通过HTTP方法PUT和DELETE解决我的REST Web服务。但是,它们似乎都不起作用。 (即删除WebDAV处理程序或允许所有动词传递给ExtensionlessHandler)。
ASP.NET Core Web API(在IIS上)要允许这两个动词(HTTP PUT和DELETE)需要什么?
PS:我已经使用CORS配置了我们的Web API项目,但是我正在从相同来源的网页访问Web服务。因此,这也不是CORS的问题。
答案 0 :(得分:2)
这花了我几个小时才弄明白。我使用的是 ASP.NET Core 5,不需要修改 web.config 来删除 WebDav 或任何东西。相信大部分人都没有意识到POST方法和PUT、DELETE方法的签名区别。
http://servername/api/controller
http://servername/api/controller/id
请注意,您必须将 id 放在 PUT 和 DELETE 的 URL 中。祝你好运。
答案 1 :(得分:0)
一天后,我现在找到了导致此错误的原因。以下原因导致此错误发生:
[HttpPut]
,[HttpDelete]
)是不够的。因此,必须应用这些属性(这是ASP.NET Core 所特有的)。[HttpPut("{id}")]
,[HttpDelete("id")]
)提供方法的地址(和查询字符串,分别)参数。 (这是ASP.NET 核心所特有的。)请参见ASP.NET Core Web API: Routing by method name?。
我相信“ 405方法不允许” 相当是不适当的错误消息。它没有反映出以上三个原因中的任何一个,并且非常令人困惑。
此外,我相信“ 400错误的请求”,“未找到 404 ”或-而是“未实现 501 “本来是更合适的HTTP返回状态。
我为此创建了一个GitHub问题:
"405: Method not allowed" = Misleading error message → Replace with better HTTP status code
答案 2 :(得分:0)
@AxD解释得很好。就我而言,以下是问题所在。
[HttpDelete("{cardioId:length(24)}")]
public async Task<IActionResult> Delete([FromBody] string cardioId)
错误地在复制和粘贴代码时,我忘记将[FromBody]更改为[FromRoute],这导致此 405不允许使用方法错误,这确实不合适。
遇到此类错误时,请仔细检查此类错误。