c# - 让 WebAPI2 中的 PUT 和 DELETE 动词在 IIS 8.5 上工作

标签 c# asp.net iis asp.net-web-api web-config

我正在尝试将代码发布到我公司的测试 Web 服务器,但在尝试使用 PUT 或 DELETE 谓词调用任何方法时,我收到了 IIS 返回的大量错误。我研究了这个特定问题,我尝试的所有结果要么什么都不做,要么产生新的错误。当我尝试使用默认的 system.webServer 配置时,我收到一般的 405 方法不允许错误,这是 web.config 的那部分:

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
    <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>
</system.webServer>

通过谷歌和几篇堆栈文章的挖掘,大多数接受的答案都指定通过我已经完成的网络配置文件删除 WebDAV,这是更新的代码:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules
  <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="WebDAV" />
      <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>
</system.webServer>

当我尝试使用仅删除 WebDAV 处理程序时,我继续收到 405 方法不允许的错误,但是一旦我删除 WebDAVModule,我的错误就变成了 500 内部服务器错误,并且从服务器查看不会实际上给我任何进一步的信息。

我还尝试了围绕删除和添加“ExtensionlessUrlHandler-ISAPI-4.0_32bit”和“ExtensionlessUrlHandler-ISAPI-4.0_64bit”处理程序的建议,结果相同(405 当不删除 WebDAVModule 或 500 时我确实删除了它)。

这是我试图调用的 WebApi Controller 上的方法,也许这就是问题所在,尽管它在我的开发环境中工作得很好:

public string PutRegistrationBatch(RegistrationBatch Model) {
  // Code to save the model to our database
}
public string DeleteRegistrationBatch(RegistrationBatch Model) {
  // Code to delete the item from the database
}

更新

我对应用程序进行了跟踪,我看到 GET 和 POST 命令可以访问该站点,但是 PUT 或 DELETE 命令都没有可以访问该站点:

  1. 1/10/2017 1:22:41 PM/api/RegistrationBatch/200 GET
  2. 1/10/2017 1:22:55 PM/api/RegistrationBatch/200 POST

似乎 PUT 和 DELETE 命令在主机级别被过滤掉并被拒绝,并且永远不会进入我的应用程序。

更新

WebDAV 似乎是根本问题,但我们运行的 Web 服务使用了该技术,因此在我们更新该服务之前,无法删除它。同时,我发现 Scott Hanselman 在这里 ( http://www.hanselman.com/blog/HTTPPUTOrDELETENotAllowedUseXHTTPMethodOverrideForYourRESTServiceWithASPNETWebAPI.aspx ) 概述的解决方法允许我将 PUT 和 DELETE 请求作为 POST 请求发送。

我不认为这是问题的答案,但它至少允许我解决问题,直到我们可以卸载 WebDAV 并希望这将允许我的 Web Api 2 应用程序才能正常工作。

最佳答案

您需要在相应的操作上应用[HttpPut][HttpDelete] 属性

[HttpPut]
public string PutRegistrationBatch(RegistrationBatch Model) { ... }

[HttpDelete]
public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }

并且在配置文件中你也应该尝试使用你想要允许的特定动词

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

关于c# - 让 WebAPI2 中的 PUT 和 DELETE 动词在 IIS 8.5 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41571307/

相关文章:

powershell - 如何通过 windows powershell 命令在 IIS 网站中设置 ID 属性

css - 调试时 MVC CSS 未在 Visual Studio 中呈现

c# - 不同固件中的协方差导致代码中断?

c# - 启用 Unity 以解决来自 OwinContext 的依赖项

c# - Visual Studio 2015 的文本资源管理器窗口中的选定测试是同时运行还是顺序运行?

c# - 如何在不在 JavaScript 中定义类的情况下创建类?

c# - 缩放图像,但保持其比例

c# - 将值从 ASP.NET 页面发布到 C#

c# - 如何在 GridView 中获取隐藏字段的值?

c# - 如何在本地 IIS 而非 Express 中调试 ASP.NET 5 Web 应用程序