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

时间:2012-04-11 03:06:14

标签: iis-7.5 asp.net-mvc-4 asp.net-web-api

我编写了一个使用ASP.NET MVC Web API的站点,一切都运行良好,直到我把它放在登台服务器上。该站点在我的本地计算机和开发Web服务器上运行良好。开发和登台服务器都是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) 

开发和分期时的配置相同,事实上整个网站都是直接复制。

为什么GET和POST会起作用,而不是PUT?

9 个答案:

答案 0 :(得分:46)

对于那些没有启用WebDAV但仍在使用MVC 4的Web API进行此问题的人......

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

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

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

答案 1 :(得分:26)

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

从iis中删除web-dav。

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

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

答案 2 :(得分:12)

这似乎有很多原因。以上都不适合我。我已经在web.config中使用了所有必需的HTTP谓词的ExtensionlessUrlHandler设置。最后,我必须在IIS中进行以下更改:

  • 在IIS中选择您的网站,然后双击Handler Mappings
  • 查找ExtensionlessUrlHandler-ISAPI-4.0_32bit并双击
  • 在显示的对话框中,点击Request Restrictions
  • 在动词标签上添加以逗号分隔的缺少的HTTP动词(在我的情况下是PUTDELETE
  • 点击所需的Ok,然后在弹出的Yes对话框中回答Edit Script Map
  • 重复ExtensionlessUrlHandler-ISAPI-4.0_64bit

希望这有助于某人:)

答案 3 :(得分:5)

我的托管服务提供商无法卸载WebDAV,因为这会影响所有人。

这,runAllManagedModulesForAllRequests =&#34; true&#34; ,有效,但不推荐。

许多修复包括删除WebDAVModule的模块,但仍然无法正常工作。我也删除了处理程序,最后我可以使用所有动词POST GET PUT DELETE。

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:4)

就我而言,这些解决方案都没有适用。

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

处理程序:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

不适用于经典应用程序池,因为其preConditionintegratedMode

答案 6 :(得分:1)

来自West-Wind的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>
    
这对我来说非常好。

答案 7 :(得分:1)

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

1)在IIS中,选择您的应用程序。
2)转到请求过滤
3)然后选择HTTP Verbs标签
4)我发现PUT和其他动词被允许为false,但无法进行编辑,因此我删除了该动词,然后在右侧窗格中选择允许动词或右键单击列表并选择它。输入您遇到麻烦的动词和voilà!

希望这会对某人有所帮助!

答案 8 :(得分:0)

我通过将以前在经典模式下将网站的应用程序池更改为集成模式来解决此问题。