C# 获取WebAPI2中的PUT和DELETE谓词以在IIS 8.5上工作

C# 获取WebAPI2中的PUT和DELETE谓词以在IIS 8.5上工作,c#,asp.net,iis,asp.net-web-api,web-config,C#,Asp.net,Iis,Asp.net Web Api,Web Config,我试图将代码发布到我的公司测试web服务器,当我试图使用PUT或DELETE动词调用任何方法时,IIS返回了大量错误。我研究过这个特殊的问题,我尝试过的所有结果要么什么都不做,要么产生一个新的错误。当我尝试使用默认system.webServer配置时,我收到了general 405 method not allowed错误,下面是web.config的该部分: <system.webServer> <validation validateIntegratedModeCon

我试图将代码发布到我的公司测试web服务器,当我试图使用PUT或DELETE动词调用任何方法时,IIS返回了大量错误。我研究过这个特殊的问题,我尝试过的所有结果要么什么都不做,要么产生一个新的错误。当我尝试使用默认system.webServer配置时,我收到了general 405 method not allowed错误,下面是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>
更新

我在应用程序上运行了一个跟踪,我看到GET和POST命令到达了站点,但是PUT或DELETE命令都没有到达站点:

  • 2017年10月1日下午1:22:41/api/RegistrationBatch/200 GET
  • 2017年10月1日下午1:22:55/api/RegistrationBatch/200 POST
  • 似乎PUT和DELETE命令在主机级别被过滤和拒绝,并且从未进入我的应用程序

    更新

    WebDAV似乎是潜在的问题,但我们运行的web服务利用了这项技术,因此在我们能够更新该服务之前,删除它不是一个选项。同时,我发现Scott Hanselman在这里()概述的解决方法允许我将PUT和DELETE请求作为POST请求发送


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

    您需要应用
    [HttpPut]
    [HttpDelete]
    各操作的属性

    [HttpPut]
    public string PutRegistrationBatch(RegistrationBatch Model) { ... }
    
    [HttpDelete]
    public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }
    
    在配置文件中,您还应该尝试使用您希望允许的特定动词

    
    
    如果安装了WebDAV IIS功能,可能会与Put、Delete和Patch请求发生冲突(可能更多…记不起来)。您可以在服务器范围内卸载该功能,也可以从system.webServer元素中手动删除HttpModule和HttpHandler,以针对此特定应用程序。看

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

    将“默认网站”和网站的所有模块配置重置为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>
    
    
    
    您有权访问应用程序日志吗?内部服务器错误可能意味着您的应用程序逻辑引发异常(例如,数据库授权错误)。我让我们的一名服务器管理员检查了服务器上的事件日志,但没有任何记录。您的应用程序是否具有跟踪功能?我会打开它以确保将请求移交给您的应用程序。我通过web.config启用了跟踪,但没有为应用程序生成跟踪文件。这可能意味着没有为站点安装/启用跟踪。我们仍然无法确定错误来自何处。我建议在应用程序中添加应用程序级跟踪/日志记录。我只是按照您的建议编辑了代码,但得到了相同的结果。没有明显区别。WebDAV安装在另一个应用程序的服务器上,但是正如我在原始帖子中提到的,通过web.config删除它实际上会导致进一步的问题。据我所知,WebDAV未列在我的应用程序的处理程序或模块中,但它列在服务器级别(和默认网站)上,我猜我需要将其从默认网站中删除,因为调用无法访问我的应用程序。您的应用程序池是以集成还是经典管道模式配置的?我问这个问题的原因是因为删除模块和处理程序有点不同(它在system.web的某个地方,而不是在经典模式下的system.webServer)。还要检查您是否有请求筛选设置(通过IIS管理控制台或在web.config中查找
    /
    。还要检查
    C:\Windows\System32\inetsrv\config\applicationHost.config
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\web.config
    (调整位/版本的路径)。我的应用程序的应用程序池是在集成模式下配置的。没有HTTP谓词的请求筛选设置,它只是设置为允许所有操作,除非列表中另有说明。但是,父级的默认网站是在经典模式下配置的,不确定这是否有任何区别。我之前注意到ExtensionlessUrlHandler处理程序映射到默认网站上,Integrated-4.0在服务器级别被禁用。我在服务器级别启用了它,但仍然没有效果。当ExtensionlessUrlHandler不工作时,我认为它通常甚至会影响GET请求。如果将GET请求添加到同一控制器,则会出现问题le with,你能确认它的路由是否正确吗?尝试安装RoutedBugger以验证路由是否正常工作。405是WebDav。500 w/WebDav是被禁用的YSOD还是IIS 500页面?如果是后者,你的请求不会进入你的应用程序。在global.asax中为每个事件设置事件处理程序,并在每个事件中设置断点事件处理程序(调用GetHashCode或无副作用的东西&在所有事件上设置断点)我所有的POST和GET请求都可以在我的应用程序中工作,但PUT或DELETE请求都不能。500是一个IIS 500页面,我知道它无法进入我的应用程序,因为我启用了跟踪功能,并且看不到这些请求。关于调试,如果没有进一步的建议,我无法访问web服务器上的Visual Studio,我将与我们的网络团队联系,看看是否可以安装它来解决此问题。
    [HttpPut]
    public string PutRegistrationBatch(RegistrationBatch Model) { ... }
    
    [HttpDelete]
    public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }
    
    <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>