为啥在禁用 webdav 后,在本地工作的 WebApi 的 DELETE 请求上出现 405 方法不允许错误?

Posted

技术标签:

【中文标题】为啥在禁用 webdav 后,在本地工作的 WebApi 的 DELETE 请求上出现 405 方法不允许错误?【英文标题】:Why am I getting a 405 method not allowed error on a DELETE request for WebApi that works locally, after disabling webdav?为什么在禁用 webdav 后,在本地工作的 WebApi 的 DELETE 请求上出现 405 方法不允许错误? 【发布时间】:2015-07-03 07:30:39 【问题描述】:

当我调用 WebApi DELETE 端点时,我收到一个 405 错误,提示“请求的资源不支持 http 方法'DELETE'”。这个问题只发生在我们的暂存环境中,并且在本地一切正常。

我知道有很多关于 SE 的问题与此问题相关,但相信我已经尝试了所有标准解决方案,包括:

1) 确认我的参数名称与我的 webapiconfig 路由设置匹配: config.Routes.MapHttpRoute("Default", "api/controller/id", new id = RouteParameter.Optional); 是路由配置和 public HttpActionResult Delete(int id) 是控制器方法签名。

2) 在我的 Web.config <handlers> 中尝试使用 verb="*" 和 verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 进行 url 路由。

3) 在我的 Web.config 中添加 <remove name="WebDAVModule"/><modules runAllManagedModulesForAllRequests="true"><remove name="WebDAV"/><handlers>。 (我通读了这篇文章并尝试复制 here 发布的解决方案,以及在 SE 上找到的几个变体。

进行调用时不涉及 javascript,因此排除了解决此问题的其他常见解决方案。下面是我现在的 web.config 文件的 system.webServer 部分。有什么想法吗?

<system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule"/> </modules> <handlers> <remove name="WebDAV" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>

【问题讨论】:

【参考方案1】:

所以,为了子孙后代 - 问题实际上出在暂存和生产机器上的 IIS 配置上。 IIS 指向的文件路径不是 Octopus 部署最新版本站点的文件夹,而是存储旧版本的文件夹。所以网站还在运行,但没有使用新代码。我在问题中尝试的修复是成功的。

【讨论】:

以上是关于为啥在禁用 webdav 后,在本地工作的 WebApi 的 DELETE 请求上出现 405 方法不允许错误?的主要内容,如果未能解决你的问题,请参考以下文章

Confluence 6 WebDAV 禁用严格路径检查

webDAV IIS6 身份验证不适用于匿名禁用

Apache在Windows上停止webdav目录列表

405 方法不允许 Web API

为啥 MySQL 禁用加载本地 infile 不起作用?

为啥我的参考的复制本地属性被禁用?