iis - 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 丢弃请求的原因的更多详细信息?
解决方案
在请求进入 IIS 之前,您是否使用任何负载平衡或反向代理?这个错误说明日志不能存储更多丢失的连接,所以问题是你的连接丢失了。
- 如果您使用负载平衡,Web 应用程序的负载会很重,
因此当前没有线程可用于向 HTTP.sys 提供日志记录数据。检查这个。 - 或者在 IIS 响应客户端之前,客户端已经关闭了请求,但 IIS 仍然发送响应。这更有可能是应用程序本身的问题,而不是 IIS 和 http.sys。检查这个。
我注意到的一件事是,如果您将 http2 更改为 1.1,它可以正常工作。http1.1 和 2 的区别在于性能。
HTTP/1.1 实际上每个 TCP 连接只允许一个未完成的请求(虽然 HTTP 流水线允许多个未完成的请求,但它仍然不能完全解决问题)。
HTTP/2.0 允许对多个并行请求使用相同的 TCP 连接
所以看起来,当你使用http2时,一个连接包含多个请求,应用程序无法很好地处理这些请求,尤其是图像的请求。
另一件事是失败的请求跟踪可以捕获所有请求和响应,包括状态码是 200 和 302。
推荐阅读
- php - 所有 API 路由的语言和国家/地区
- javascript - java脚本中的delete函数将删除第一个索引
- python - Python:过滤器和生成器
- sql - 自动增量值选择
- php - EventSource 的响应具有不是“text/event-stream”的 MIME 类型(“application/x-httpd-php”)。中止连接
- c# - 如何在 Windows 主机上处理来自 Datalogic Matrix 扫描仪的条形码?
- php - 获取 MySQL 中多个字段的计数
- java - 将 LinkedHashMap 转换为自定义 java 对象 android
- vba - VBA - 离开直到到达特定行
- javascript - 如何在输入类型中使用变量