为什么我在禁用 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 部署网站最新版本的文件夹,而是存储旧版本的文件夹。所以该站点仍在运行,但未使用新代码。我在问题中尝试的修复是成功的。
当我调用 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 部署网站最新版本的文件夹,而是存储旧版本的文件夹。所以该站点仍在运行,但未使用新代码。我在问题中尝试的修复是成功的。