首页 > 解决方案 > ISAPI 过滤器修改 302 响应 - IIS 丢弃请求并放入 HTTPERR - IPv6 / HTTP2.0

问题描述

需要一些帮助才能更深入地了解 IIS 以某种方式运行的原因。Edge/Chrome 使用标头中的 IPv6 地址 (https://[ipv6]/) 向 IIS 发出 HTTP2.0 请求,这会导致服务器生成 302 响应。ISAPI 过滤器对 302 响应进行了一些修改并替换了响应缓冲区。IIS 丢弃请求/响应并记录在 HTTPERR 日志中:

<date> <time> fe80::a993:90bf:89ff:1a54%2 1106 fe80::bdbf:5254:27d2:33d8%2 443 HTTP/2.0 GET <url> 1 - 1 Connection_Dropped_List_Full <pool>

怀疑与HTTP2.0有关,将Fiddler放在中间时,它不再是HTTP/2.0,而是降级到HTTP/1.1并且可以工作。

使用 IPv4 地址时,它可以工作。在任何一种情况下,过滤器都会经历相同的步骤。过滤器中没有任何迹象表明出现任何问题。

失败的请求跟踪不会为出现在 HTTPERR 日志中的不完整/丢弃的请求写入缓冲区。

有没有一个地方可以让我找到有关 IIS 丢弃请求的原因的更多详细信息?

我进行了网络捕获,看起来浏览器正在启动会话的 FIN 拆除。 在此处输入图像描述

标签: iis

解决方案


在请求进入 IIS 之前,您是否使用任何负载平衡或反向代理?这个错误说明日志不能存储更多丢失的连接,所以问题是你的连接丢失了。

  1. 如果您使用负载平衡,Web 应用程序的负载会很重,
    因此当前没有线程可用于向 HTTP.sys 提供日志记录数据。检查这个
  2. 或者在 IIS 响应客户端之前,客户端已经关闭了请求,但 IIS 仍然发送响应。这更有可能是应用程序本身的问题,而不是 IIS 和 http.sys。检查这个

我注意到的一件事是,如果您将 http2 更改为 1.1,它可以正常工作。http1.1 和 2 的区别在于性能。

HTTP/1.1 实际上每个 TCP 连接只允许一个未完成的请求(虽然 HTTP 流水线允许多个未完成的请求,但它仍然不能完全解决问题)。

HTTP/2.0 允许对多个并行请求使用相同的 TCP 连接

所以看起来,当你使用http2时,一个连接包含多个请求,应用程序无法很好地处理这些请求,尤其是图像的请求。

另一件事是失败的请求跟踪可以捕获所有请求和响应,包括状态码是 200 和 302。


推荐阅读