Iis 7.5 ASP.NET Web API仅在某些服务器上为PUT返回404

Iis 7.5 ASP.NET Web API仅在某些服务器上为PUT返回404,iis-7.5,asp.net-mvc-4,asp.net-web-api,Iis 7.5,Asp.net Mvc 4,Asp.net Web Api,我已经编写了一个使用ASP.NET MVC Web API的网站,在我将其放到登台服务器之前,一切都很正常。该站点在我的本地机器和devweb服务器上运行良好。开发服务器和临时服务器都是Windows Server 2008 R2 问题是:基本上站点是可以工作的,但是有些API调用使用HTTP PUT方法。它们在返回404时失败,但在其他地方可以正常工作 我遇到并解决的第一个问题是请求过滤。但还是得到了404 我已在IIS中打开跟踪,并遇到以下问题 168. -MODULE_SET_RESPON

我已经编写了一个使用ASP.NET MVC Web API的网站,在我将其放到登台服务器之前,一切都很正常。该站点在我的本地机器和devweb服务器上运行良好。开发服务器和临时服务器都是Windows Server 2008 R2

问题是:基本上站点是可以工作的,但是有些API调用使用HTTP PUT方法。它们在返回404时失败,但在其他地方可以正常工作

我遇到并解决的第一个问题是请求过滤。但还是得到了404

我已在IIS中打开跟踪,并遇到以下问题

168. -MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName IIS Web Core 
Notification 16 
HttpStatus 404 
HttpReason Not Found 
HttpSubStatus 0 
ErrorCode 2147942402 
ConfigExceptionInfo  
Notification MAP_REQUEST_HANDLER 
ErrorCode The system cannot find the file specified. (0x80070002) 
dev和staging上的配置是相同的,事实上整个站点是一个直接副本


为什么GET和POST有效,而PUTs无效?

那些IIS服务器上安装了web dav模块,我打赌它不需要,安装它是因为安装者勾选了所有框

只需从iis中删除web dav

或者使用web.config删除web dav模块:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    ...

...

对于未启用WebDAV但仍使用MVC 4的Web API遇到此问题的用户

Steve Michelotti记录了一个对我有效的解决方案

在一天结束时,我在我的web配置中启用了ExtensionlessUrlHandler-Integrated-4.0处理程序的所有谓词(verb=“*”)

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
</system.webServer>

我的主机提供商无法卸载WebDAV,因为这会影响所有人

runAllManagedModulesForAllRequests=“true”虽然有效,但不推荐使用

许多修复包括删除WebDAVModule的模块,但仍然不起作用。我还删除了处理程序,最后我可以使用所有动词POST-GET-PUT-DELETE

删除模块和处理程序中的WebDAVModule和WebDAV

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>

西风公司的Rick Strahl建议: < handlers> < remove name="ExtensionlessUrlHandler-Integrated-4.0"/> < add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> < /handlers>
这对我来说非常有效。

我解决了这个问题,将网站的应用程序池更改为集成模式,而以前它是经典模式

我修复了删除UrlScan ISAPI过滤器的问题

在我的情况下,这些解决方案都不适用

我通过将我的应用程序池改为集成版而不是经典版来修复它

处理程序:


它不适用于经典应用程序池,因为它的
前提条件是
integratedMode

出现这种情况的原因很多。以上这些对我都不起作用。我已经在web.config中设置了ExtensionlessUrlHandler,其中包含所有必需的HTTP谓词。最后,我不得不在IIS中进行以下更改:

  • 在IIS中选择您的网站并双击处理程序映射
  • 找到
    ExtensionlessUrlHandler-ISAPI-4.0\u 32bit
    并双击
  • 在出现的对话框中,单击请求限制
  • 在Verbs选项卡上,添加缺少的HTTP谓词,以逗号分隔(在我的例子中是
    PUT
    DELETE
  • 在需要的地方单击
    Ok
    ,并在弹出的
    编辑脚本映射
    对话框中回答
    Yes
  • ExtensionlessUrlHandler-ISAPI-4.0\u 64位重复上述操作

  • 希望这对某人有所帮助:)

    嗨,对我来说,所有的解决方案都不起作用。我终于做到了:

    1) 在IIS中选择您的应用程序
    2) 转到请求筛选
    3) 然后选择HTTP谓词选项卡
    4) 我发现PUT和其他动词允许false,但无法直接编辑,因此我删除了该动词,然后在右侧窗格中选择allow verb或右键单击列表并选择它。输入你遇到麻烦的动词,瞧


    希望这能帮助别人

    我的回答有用吗?你试过了吗?是的,它确实有效,谢谢。这对我来说解决了(这个问题原来是这个问题的重复)。对我来说,只有部分有效。请注意,应该避免runAllManagedModulesForAllRequests,这里似乎不需要它。正是这个-->使一切正常工作。它告诉IIS忽略处理程序中设置的“先决条件”。我们的DevOps团队会对动词=“*”感到畏缩,但这实际上是在配置IIS以接受所有动词。您还可以在IIS HttpHandlers配置屏幕中手动更改这些处理程序的配置。添加对我来说是解决问题的方法。有时WebDAV是PUT问题的罪魁祸首,但事实上,这个问题特别是WebApi(使用无扩展url处理程序)我建议大家先试试Kevin Ortman的答案。如果您使用OWIN中间件并在IIS上托管,那么问题很可能是因为OWIN只支持集成模式,这非常有帮助!这应该先检查一下,这对我很有效。但我很想知道根本原因是什么。我刚刚更新了一些ASP.NETWebAPI包,这些包自动更改了Web.config中的一些设置,问题就开始了。IIS上绝对没有任何更改。