33

我已经编写了一个使用 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) 

dev 和 staging 的配置是一样的,事实上整个站点是一个直接的副本。

为什么 GET 和 POST 可以工作,而 PUT 不行?

4

9 回答 9

51

对于那些没有启用 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>
于 2012-04-19T04:15:56.657 回答
28

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

只需从 iis 中删除 web-dav。

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

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    ...
于 2012-04-11T07:21:08.130 回答
13

发生这种情况似乎有很多原因。以上都不适合我。我已经在 web.config 中有 ExtensionlessUrlHandler 设置以及所有必需的 HTTP 动词。最后,我不得不在 IIS 中进行以下更改:

  • 在 IIS 中选择您的网站并双击Handler Mappings
  • 查找ExtensionlessUrlHandler-ISAPI-4.0_32bit并双击
  • 在出现的对话框中,单击Request Restrictions
  • 在动词选项卡上添加以逗号分隔的丢失的 HTTP 动词(在我的情况下是PUTDELETE
  • 在需要的地方单击并在弹出的对话框中Ok回答。YesEdit Script Map
  • 重复ExtensionlessUrlHandler-ISAPI-4.0_64bit

希望这可以帮助某人:)

于 2016-11-15T20:57:47.100 回答
5

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

这 runAllManagedModulesForAllRequests="true" 有效,但不推荐。

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

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

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>
于 2012-11-27T05:34:26.667 回答
4

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

于 2015-05-19T15:56:21.307 回答
4

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

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

处理程序:

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

不适用于 Classic 应用程序池,因为它preConditionintegratedMode.

于 2015-07-27T20:46:48.007 回答
1

West-Wind 的 Rick Strahl 提出以下建议:

    <处理程序>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
    < add name="ExtensionlessUrlHandler-Integrated-4.0"
    路径=“*。”
    动词=“获取,头部,发布,调试,放置,删除,补丁,选项”
    type="System.Web.Handlers.TransferRequestHandler"
    preCondition="integratedMode,runtimeVersionv4.0"
    />
    < /处理程序>
    
这对我来说非常有效。

于 2014-04-15T19:48:05.980 回答
1

嗨对我来说,没有一个解决方案有效。我终于让它工作了:

1) 在 IIS 中选择您的应用程序。
2) 转到请求过滤
3) 然后选择 HTTP Verbs 选项卡
4) 我发现 PUT 和其他动词允许为假但无法编辑所以我删除了动词然后在右侧的窗格中选择允许动词或右键单击列表并选择它。输入您遇到问题的动词,瞧!

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

于 2018-08-31T09:24:37.177 回答
0

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

于 2014-07-11T01:52:36.760 回答