对 IIS 的 GET 请求返回 Microsoft-HttpApi/2.0

Posted

技术标签:

【中文标题】对 IIS 的 GET 请求返回 Microsoft-HttpApi/2.0【英文标题】:GET request to IIS returns 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 上的主机头配置了吗? 这里有点离题,但请检查您的服务,看看是否有一个不应该启动的服务。 ***.com/questions/2158432/wamp-port-80-busy 在我的情况下,问题是我创建了与特定 IP 地址而不是“*”的 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 等)。

但是这行得通:

    打开注册表 导航 HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\ 如果 DisableServerHeader 不存在,则创建它(DWORD 32 位)并将其值设置为 2。如果存在但值不是 2,请将其设置为 2。 最后,通过调用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 个字符,所以我

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

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

试试这些链接

“the underlying problem is that the client has sent a request to IIS that breaks one or more rules that HTTP.sys is enforcing” enabling logging on HTTP.sys is described here a list of the HTTP.sys parameters that you can control in the registry is found here。

【讨论】:

很好的参考资料! 我还必须在 cmd 中运行“net start w3svc”才能让我的网站重新上线。 我在 windows server 2016 IIS 10 上尝试了这些步骤,但仍无法正常工作,但仍得到“Microsoft-HttpApi/2.0”响应

以上是关于对 IIS 的 GET 请求返回 Microsoft-HttpApi/2.0的主要内容,如果未能解决你的问题,请参考以下文章

Post 提交,参数长度有限制吗

部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误

Post 提交,参数长度有限制吗

如何配置 IIS 7.5 以使用“POST”方法接受对 .json 文件的请求

为啥 IIS 返回空响应?

关于java post get请求Demo (请求c#iis接口)