gpt4 book ai didi

asp.net - 为什么 ASP.NET 在手动刷新响应时将 Content-Length header 替换为 Transfer-Encoding header ?

转载 作者:行者123 更新时间:2023-12-03 14:18:58 25 4
gpt4 key购买 nike

我们的 Web 应用程序(ASP.NET Web 窗体)有一个页面,该页面将向用户显示最近生成的 PDF 文件。由于 PDF 文件有时非常大,我们实现了一种“流式传输”方法,将其分 block 发送到客户端浏览器。

尽管以 block 的形式发送数据,但我们在发送文件之前就知道文件的完整大小,因此我们适本地设置了 Content-Length header 。直到今天,这已经在我们的生产环境中运行了一段时间(并且在我们的测试环境中继续使用几乎相同的配置)。报告的问题是 Chrome 会尝试打开 PDF 文件,但会因“加载”动画卡住而挂起。

因为在我们的测试环境中一切正常,所以我能够使用 Firebug 查看在两个环境中返回的响应 header 。在测试环境中,我看到了一个正确的“Content-Length” header ,而在生产环境中,它已被 替换。传输编码:分 block 标题。 Chrome 不喜欢这样,因此挂断了。

我已经阅读了一些文章和帖子,这些文章和帖子讨论了在没有提供 Content-Length header 时如何显示 Transfer-Encoding header ,但是我们指定了 Content-Length header ,并且在为测试服务器上的相同 PDF 文件。

测试和生产服务器都运行 IIS 7.5,并且都启用了动态和静态压缩。

这是有问题的代码:

var fileInfo = new FileInfo(fileToSendDown);
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "filename=test.pdf");
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
var buffer = new byte[1024];
using (var fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read))
{
int read;
while ((read = fs.Read(buffer, 0, 1024)) > 0)
{
if (!response.IsClientConnected) break;
Response.OutputStream.Write(buffer, 0, read);
Response.Flush();
}
}

我很幸运在本地工作站上看到了相同的行为,因此使用调试器我能够看到在调用“Flush”期间第二次通过 while 循环设置了“Transfer-Encoding:chunked” header .此时,响应同时具有 Content-Length header 和 Transfer-Encoding header ,但不知何故,当响应到达浏览器时,Firebug 仅显示 Transfer-Encoding header 。

更新

我想我已经追踪到使用“ block ”中发送数据并将“过滤器”附加到 HttpResponse 对象的组合(我们使用过滤器来跟踪发送到每个页面的 View 状态的大小) .在将 PDF 发送到浏览器时,我们使用 HTTP 过滤器没有任何意义,因此在此处清除过滤器已经解决了我们的问题。纯粹出于好奇,我决定更深入地挖掘,并更新了这个问题,以防其他人在 future 偶然发现这个问题。

我在 AppHarbor 上有一个简单的应用程序,它重现了这个问题: http://transferencodingtest.apphb.com/ .如果您同时选中“使用过滤器?”和“发送 block ?”框,您应该能够看到“传输编码:分 block ”标题出现(使用 Chrome 开发工具、Firebug、Fiddler 等)。如果没有选中任何一个框,您将获得正确的内容长度标题。底层代码在 github 上,因此您可以看到幕后发生的事情:

https://github.com/appakz/TransferEncodingTest

请注意,要在本地进行复制,您需要在 IIS 7.5 中设置一个本地网站(7 也可以工作,我没有尝试过)。 Visual Studio 附带的 ASP .NET 开发服务器不会重现该问题。

我在此处的博客文章中添加了更多详细信息: 'Content-Length' Header Replaced With 'Transfer-Encoding: Chunked' in ASP .NET

最佳答案

来自 an article on MSDN似乎您可以禁用分 block 编码:

appcmd set config /section:asp /enableChunkedEncoding:False

enter image description here

但它在 ASP settings 下被提及,因此它可能不适用于从 ASP.NET 处理程序生成的响应。

关于asp.net - 为什么 ASP.NET 在手动刷新响应时将 Content-Length header 替换为 Transfer-Encoding header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com