405方法不允许在ASP.NET WebAPI中进行PUT和DELETE

时间:2019-03-03 12:12:22

标签: asp.net asp.net-web-api2

我已经使用ASP.NET Web API构建了一些API终结点。当我尝试执行 PUT DELETE 请求时,出现 405不允许使用方法错误。但这对于 GET POST 请求很好。

有趣的是,当我将项目托管在本地IIS中时,PUT和DELETE运行良好。只会在 DEV 服务器中抛出 405 错误。

在我的 web.config 中:

    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
  </system.webServer>

我在这里想念什么?预先感谢。

1 个答案:

答案 0 :(得分:1)

如果您使用Visual Studio 2012或更高版本来开发Web API应用程序,则IIS Express是默认的Web服务器。此Web服务器是服务器产品中随附的完整IIS功能的按比例缩小的版本,并且此Web服务器包含为开发方案添加的一些更改。例如,WebDAV模块通常安装在运行IIS完整版的生产Web服务器上,尽管实际上可能没有使用。

IIS的开发版本(IIS Express)安装了WebDAV模块,,但是有意注释掉了WebDAV模块的条目,因此从未在IIS Express上加载WebDAV模块。因此,您的Web应用程序可能会在本地计算机上正常工作,但是在将Web API应用程序发布到生产Web服务器时,您可能会遇到HTTP 405错误。

由于您的DEV服务器具有完整的IIS功能(带有WebDAV),它将为同一动词/方法注册多个处理程序,并且其中一个处理程序正在阻止预期的处理程序处理请求。

因此,WebDAV覆盖了HTTP PUT和DELETE。在处理HTTP PUT请求期间,IIS调用WebDAV模块,在调用WebDAV模块时,它会检查其配置并看到已禁用,因此对于与WebDAV请求类似的任何请求,它将返回HTTP 405 Method Not Allowed错误。

您可以在此处https://docs.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

了解更多信息

要禁用WebDAV,请将以下内容添加到您的web.config

<system.webServer>
 <modules>
  <remove name="WebDAVModule"/>
 </modules>
 <handlers>
  <remove name="WebDAV" />
 </handlers>
</system.webServer>