【问题标题】:GET request to IIS returns Microsoft-HttpApi/2.0对 IIS 的 GET 请求返回 Microsoft-HttpApi/2.0
【发布时间】:2016-05-18 14:08:35
【问题描述】:

我有 6 台运行 IIS 和 Apache 的相同机器。今天他们中的一个决定停止服务请求。当我从 localhost/resource 尝试时,我可以访问所有的 webapps,但是当我从 url/resource 尝试时,我得到一个 404。我对不工作的机器做了一个 Get 请求,我得到了这个:

  • 服务器:Microsoft-HTTPAPI/2.0
  • 连接:关闭

与工作服务器相比:

  • 服务器:Microsoft-IIS/8.5
  • X-Powered-By:ASP.NET
  • 内容类型:文本/html

试图搜索这个问题,但什么都没有,有人知道吗?

【问题讨论】:

  • 你检查 IIS 上的主机头配置了吗?
  • 这里有点离题,但请检查您的服务,看看是否有一个不应该启动的服务。 stackoverflow.com/questions/2158432/wamp-port-80-busy
  • 在我的情况下,问题是我创建了与特定 IP 地址而不是“*”的 IIS 绑定。绑定到“*”后,一切正常。

标签: iis


【解决方案1】:

在我的情况下,运行 Windows 10 Pro,它是 Windows MultiPoint 服务。

通过执行:

net stop wms

80 端口已释放。

【讨论】:

    【解决方案2】:

    我在客户网站上开发我们的 Web 应用程序时遇到了一个问题,即加载了网站根页面,但报告文件夹始终为文件夹中存在的文件返回 404。当应用程序设置为 4 时,404 页面显示 .Net 版本 2,并且对根中不存在的页面的测试返回了显示 .Net 4 的 404 页面。

    我尝试了http://localhost/reports 并返回了 Microsoft Reporting Services 页面。不属于我的应用程序。

    当意外的 404 出现并且文件存在时,请务必仅检查文件夹的默认文档。

    【讨论】:

      【解决方案3】:

      这个问题和一系列回复帮助我深入了解了我遇到的相关问题。我的问题集中在只使用一个子域来访问我们的服务器(例如,在我们的公司网络上在浏览器中键入“www/somepath”),过去在旧服务器上工作,但在系统运行时不再工作升级到新服务器。在使用 Chrome Devtools 检查网络流量时,我在标题中看到了意外的 Microsoft-HttpApi/2.0 字符串。

      我的 HTTP.sys 进程已经在记录,因此我可以验证我的流量是否流向该服务并返回 404 NotFound 状态代码。

      我的解决方案是为子域添加到 IIS 站点的绑定,使 IIS 响应而不是 HTTP.sys 进程,如这篇服务器故障文章 - https://serverfault.com/questions/479274/why-is-microsoft-httpapi-returning-404-to-my-network-switch 中所述

      【讨论】:

        【解决方案4】:

        有点晚了,所以放在这里给后代;-)

        在尝试了网上找到的各种解决方案后,我几乎放弃了,但找到了这个小金块。

        如果响应的 Server 标头返回 Microsoft-HttpApi/2.0,则表示调用的是 HTTP.sys,而不是 IIS。

        因此,很多变通方法都不起作用(URLScan 等)。

        但是这行得通:

        1. 打开注册表
        2. 导航 HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\
        3. 如果 DisableServerHeader 不存在,则创建它(DWORD 32 位)并将其值设置为 2。如果存在但值不是 2,请将其设置为 2。
        4. 最后,通过调用net stop http然后net start http重新启动服务

        源代码:WS/WCF: Remove Server Header

        将以下注册表标志设置为:2 HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader

        将此设置为 2 将确保自托管 WCF 服务不再发送 SERVER 标头,从而确保我们符合安全要求。
        请注意,这会禁用所有服务器标头。

        默认值 0 启用标头,值 1 禁用 DRIVER (http.sys) 的服务器标头,但应用仍然可以有标头。

        对我来说,我必须重新启动服务器才能使更改生效。

        希望这对某人有所帮助

        【讨论】:

        • 这对我有用。谢谢!这是我认为它适用于 400 错误请求的唯一方法。非常感谢您的回答。
        • 没有问题,很高兴能对某人有所帮助:-)
        • 它的工作原理..太棒了!!!!
        【解决方案5】:

        Windows 有一个 HTTP 服务,用于管理对 Windows 机器上的 IIS 和其他启用 HTTP 的服务的调用。您需要对其进行配置以处理您的呼叫,或者在 WAMP 或类似的非 IIS-web-server-on-windows 场景下,您可能只需将其关闭。

        当您看到 "Microsoft-HttpApi/2.0" 返回错误,例如 400 "bad URL" 或 "bad header" 等时,问题很可能是由于HTTP. sys 服务正在拦截您的 http 请求并终止它,因为它不符合配置的最低验证规则

        此配置位于 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 的注册表中。就我而言,它令人窒息,因为我有一个 RESTful 调用,它的 url 中有一个 400 个字符的段,比默认值 260 多 160 个字符,所以我

        1. 添加了注册表参数UrlSegmentMaxLength,DWORD值为512,
        2. 使用 net stop http 停止服务
        3. 使用 net start http 启动服务

        我之前遇到过这些问题,很容易排除故障,但网络上几乎没有解决它。

        试试这些链接

        【讨论】:

        • 很好的参考资料!
        • 我还必须在 cmd 中运行“net start w3svc”才能让我的网站重新上线。
        • 我在 windows server 2016 IIS 10 上尝试了这些步骤,但仍无法正常工作,但仍得到“Microsoft-HttpApi/2.0”响应
        猜你喜欢
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 2015-03-18
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        相关资源
        最近更新 更多