为啥在禁用 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 方法不允许错误?的主要内容,如果未能解决你的问题,请参考以下文章