使WebAPI2中的PUT和DELETE谓词在IIS 8.5上工作



我正试图将代码发布到我的公司测试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>

通过对谷歌和几篇堆栈文章的挖掘,大多数公认的答案都指定通过web配置文件删除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"处理程序,具有相同的结果(不删除WebDAVModule时为405,删除时为500)。

以下是我试图调用的WebApi控制器上的方法,也许这就是问题所在,尽管它在我的开发环境中运行得很好:

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. 2017年10月1日下午1:22:41/api/注册批次/200 GET
  2. 2017年1月10日下午1:22:55/api/注册批次/200 POST

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

更新

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

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

您需要在相应的操作上应用[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" />

如果您安装了WebDAV IIS功能,它可能会导致与Put、Delete和Patch请求发生冲突(可能更多…记不清了)。您可以在服务器范围内卸载功能,也可以从system.webServer元素中手动删除HttpModule和HttpHandlers,以针对此特定应用程序。看见https://stackoverflow.com/a/26003440/179223

我记得不久前也进过类似的沟。最终这对我起了作用。

将"默认网站"和您的网站的所有模块配置重置为IIS中的默认值。你可以通过1.选择您的网站,双击"模块"2.点击右侧Actions面板下的"Revert to Parent"链接

在Web.config 中使用以下内容

<system.webServer>
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true">
<remove name="WebDAVModule" />
</modules>
<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>

最新更新