为什么我在禁用 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?

当我调用 WebApi DELETE 端点时,我收到 405 错误消息 "The requested resource does not support http method '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>

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