【问题标题】:ASP.NET Web API returns 404 for PUT only on some serversASP.NET Web API 仅在某些服务器上为 PUT 返回 404
【发布时间】:2012-04-23 08:44:45
【问题描述】:

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

【问题讨论】:

  • 我的回答有帮助吗?你试过了吗?
  • 是的,它确实有效,谢谢。

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


【解决方案1】:

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

只需从 iis 中删除 web-dav。

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

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

【讨论】:

  • 有时 WebDAV 是 PUT 问题的罪魁祸首,但事实上,这个问题专门是 WebApi(它使用无扩展 url 处理程序),我建议人们先尝试 Kevin Ortman 的答案。
【解决方案2】:

对于那些没有启用 WebDAV 但仍然使用 MVC 4 的 Web API 遇到此问题的人...

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

最后,我在我的 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>

【讨论】:

  • 这为我解决了stackoverflow.com/questions/11257749/…(问题原来是这个问题的重复)。
  • 仅使用 部分为我工作。请注意,应该避免 runAllManagedModulesForAllRequests,这里似乎不需要。
  • 这 --> 是使一切正常的原因。它告诉 IIS 忽略处理程序中设置的“preConditions”。
  • 我们的 DevOps 团队会对 verb="*" 感到畏缩,但这实际上是在将 IIS 配置为接受所有动词。您还可以在 IIS HttpHandlers 配置屏幕中手动更改这些处理程序的配置。
  • 添加 解决了我的问题。
【解决方案3】:

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

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

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

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

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

【讨论】:

    【解决方案4】:

    West-Wind 的 Rick Strahl 推荐了以下内容:

    这对我来说非常有效。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 如果您使用 OWIN 中间件并托管在 IIS 上,那么问题很可能是因为 OWIN 仅支持集成模式
      【解决方案6】:

      我解决了这个问题,删除了 UrlScan ISAPI 过滤器

      【讨论】:

        【解决方案7】:

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

        我通过将我的应用程序池更改为 Integrated 而不是 Classic 来解决此问题。

        处理程序:

        &lt;add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /&gt;

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

        【讨论】:

          【解决方案8】:

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

          • 在 IIS 中选择您的网站并双击 Handler Mappings
          • 找到ExtensionlessUrlHandler-ISAPI-4.0_32bit并双击
          • 在出现的对话框中,单击Request Restrictions
          • 在动词选项卡上添加用逗号分隔的缺失 HTTP 动词(在我的例子中是 PUTDELETE
          • 在需要的地方单击Ok,然后在弹出的Edit Script Map 对话框中回答Yes
          • 重复ExtensionlessUrlHandler-ISAPI-4.0_64bit

          希望这对某人有帮助:)

          【讨论】:

          • 非常有帮助!这应该首先检查。
          • 这对我有用。但很想知道根本原因是什么。我刚刚更新了一些 ASP.Net Web API 包,它们自动更改了 web.config 中的一些设置,问题就开始了。 IIS 上绝对没有任何变化。
          【解决方案9】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-09
            • 1970-01-01
            相关资源
            最近更新 更多