我正在尝试将代码发布到我公司的测试 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/10/2017 1:22:41 PM/api/RegistrationBatch/200 GET
- 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/