我们有一个通过http流式传输文本数据的网站。它按以下方式设置:
Content-Type
是text/plain
Transfer-Encoding
是chunked
使用普通curl
或FireFox时,文本会从第一个字节流式传输到浏览器。但是在使用Chrome时,在发送1024个字节之前不会显示任何文本。在那之后,一切都会立即出现。
问题:有没有办法禁用此缓冲行为?
更多信息:这是一个简单的ASP.NET页面,演示了行为:
<%@ language=c# %>
<%
Response.BufferOutput = false;
Response.ContentType = "text/plain";
for (int i=0; i<50; i++)
{
Response.Write("01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567\r\n");
System.Threading.Thread.Sleep(1000);
}
%>
使用禁用压缩的web.config:
<configuration>
<system.webServer>
<urlCompression doStaticCompression="false" doDynamicCompression="false"/>
</system.webServer>
</configuration>
我还有一个在http://bufferingtest.azurewebsites.net/运行的实时复制品。只需从Chrome和FireFox中点击它即可观察不同的行为。
答案 0 :(得分:3)
尝试将Content-Type
从text/plain
切换为application/octet-stream
。
检查一下,进一步阅读:
Do I need Content-Type: application/octet-stream for file download?
此修复程序对我来说非常合适。我遇到了您正在描述的相同问题,其中发送编码为text/plain; charset=UTF-8
的小文本块导致Chrome出现延迟,但在Firefox中则没有。将类型更改为application / octet可解决Chrome上的问题,而不会影响FireFox的性能。
答案 1 :(得分:3)
将X-Content-Type-Options: nosniff
添加到标题中,然后让我知道它是怎么回事。
根据Mozilla Docs:
X-Content-Type-Options
响应HTTP标头是使用的标记 服务器指示在广告中公布的MIME类型 不应更改Content-Type
标头并予以遵循。这个 允许选择退出MIME类型嗅探,换句话说,它是一个 说网站管理员知道他们在做什么的方式。