在WebAPI2中获取PUT和DELETE谓词以在IIS 8.5上运行

时间:2017-01-10 14:32:50

标签: 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”&amp ;; “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. 1/10/2017 1:22:41 PM / api / RegistrationBatch / 200 GET
  2. 1/10/2017 1:22:55 PM / api / RegistrationBatch / 200 POST
  3. 似乎PUT和DELETE命令在主机级别被过滤掉并被拒绝,而且从未进入我的应用程序。

    更新

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我记得以前有过类似的沟渠。最终这对我有用。

将“默认网站”和您的网站的所有模块配置重置为IIS中的默认值。你可以这样做 1.选择您的网站,双击“模块” 2.单击右侧“动作”面板下的“还原为父对象”链接

在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>