gzip 被多次添加到 Content-Encoding header

gzip being added to the Content-Encoding header multiple times

~(我是什么时候发现的,见问题底部)

我正在使用传统的 ASP.NET Web 应用程序。有一个 .aspx 页面托管一个 angular 11 应用程序,该应用程序可以正常加载 9/10 次,但偶尔会返回一个错误的响应,状态为 200 OK。发生这种情况时,在 Firefox 中,页面加载时会出现“内容编码错误”,而在 Chrome 和 Edge 中,只有一个空白屏幕,控制台中出现相同的措辞。

使用 Wireshark,我能够确定当“content-encoding-error”出现时,响应 header 将三个逗号分隔的“gzip”值附加到 Content-Encodingheader,见下:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip, gzip, gzip
...  

然而,来自 .aspx 页面的正常响应如下所示。

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
..

我可以使用 aspx 的 [web 方法] 调用之一来重现该问题:

 var ctx = HttpContext.Current
 var unused = ctx.Response.Filter // Because apparently you must access it before you can set it
 ctx.Response.Filter = new GZipStream(ctx.Response.OutputStream, CompressionLevel.Optimal)
 ctx.Response.AppendHeader("Content-Encoding", "gzip") 
 ctx.Response.AppendHeader("Content-Encoding", "gzip") // <--Gzip added twice here

麻烦的是,多个“gzip”值位于 aspx 页面本身的响应中。我已经搜索了整个代码库和所有 web.config(s),试图找到应用此压缩的位置,但无济于事。所以,我想这可能是第三方做的。

我们使用 DevExtreme,我一直在我们的配置中查看这些设置:

<add key="DXEnableCallbackCompression" value="true" />
<add key="DXEnableResourceCompression" value="true" />
<add key="DXEnableResourceMerging" value="true" />
<add key="DXEnableHtmlCompression" value="true" />

我仍然无法扫描代码以查找问题。有谁知道使用 fiddler 或 Wireshark 或任何其他工具的技巧可以揭示这些 header 偶尔显示三元组的位置?

编辑:这是 GET 请求 header,其中 returns 大约 90% 的时间都是正确编码的响应。

GET http://xxx/xxx.aspx?xxx=4 HTTP/1.1
Host: xxx.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://xxx/Home.aspx
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: ASP.NET_SessionId=x; .ASPXAUTH=x;

发生时发现:

我能够定期重复这个问题。如果我关闭所有浏览器会话并回收应用程序池,则问题会出现在第一个请求上。在后续请求中,问题不会发生。

此外,罪魁祸首是嵌入在 HTML 页面上的 google 脚本。当这个脚本被删除时,页面在回收后的第一次请求时加载正常。

罪魁祸首代码:

<script type="text/javascript" src="//maps.googleapis.com/maps/api/js?key=
<%=GoogleMapAPIKey%>&channel=<%=GoogleMappingChannel%>"></script>

我确定这不是js文件本身。密钥通过服务器端处理器嵌入到标签中。这两个处理器调用 API 来获取密钥,这些调用被 gzip 压缩。我仍然不知道为什么当页面标记中存在 js include 语句时,aspx 的响应 header 得到三个“gzips”。

由于新的发现,我可能会删除这面文字墙并添加一个新问题。

当您将 Gzip 编码添加到从 aspx 页面上的标记触发的传出时,似乎会出现此问题。 angular 客户端在页面加载后以异步方式调用的所有 Web 方法都没有编码问题。

有两个通过页面 属性 调用,由页面标记触发以访问其值。这些网络方法应用了 gzip,我猜 因为这些是在页面生命周期的早期处理的,所以有些事情变得混乱了。

通过取消对这两个调用的压缩,我的问题得到了解决。

有两次调用在页面加载之前添加 Gzip 编码的函数,当时响应是 aspx 页面本身。