我可以简单的设置Transfer-Encoding
头?
将调用Response.Flush()
在某些时候导致这种情况发生的隐?
编辑
不,我不能叫Response.Headers.Add("Transfer-Encoding","anything");
抛出。
任何其他建议?
TL; DR:指定内容的长度,以达到快速的第一个字节的最好方式;你会允许在TCP分块而不是HTTP水平。如果你不知道内容长度,context.Response.BufferOutput
设置false
因为它使用传输编码分块写入的输出流将发送输出。
你为什么要设置Transfer-Encoding: chunked
?分块传输基本上是一个变通,允许发送文件,其内容长度在预先不知道。 ASP.NET,但是,在默认情况下缓存整个输出,因此不知道整体内容长度。
当然,HTTP层积在TCP和幕后TCP被分裂甚至单片HTTP响应成包“组块”无论如何 - 这意味着如果您指定的内容长度达阵和禁用输出缓冲,你会得到无需HTTP级分块最好的延迟。因此,你不需要HTTP级分块当你知道内容长度提供了快速的第一个字节。
虽然我不是HTTP的专家,我实现了一个简单的流媒体服务器与寻求支持,动态压缩,缓存等,以及我有一个快速的第一个字节的相关性合理把握 - 和分块一般是劣质选择,如果你知道内容的长度 - 这几乎肯定是为什么ASP.NET不会让你手动设置 - 它只是没有必要的。
但是,如果你不知道HTTP内容长度之前传输和缓冲太贵,您关闭输出缓冲想必服务器将必然采用分块传输编码。
什么时候使用服务器块传输编码?我只是测试,实际上如果context.Response.BufferOutput
设置为false
,当没有设置内容长度,响应分块;这样的反应是在内容编码一个1.7MB的我的完全非科学快速测试大1-2%:gzip的XML文档。由于gzip的依赖于上下文来减少冗余,我预料的压缩比,以承受更多,但似乎分块并不必然大大降低了压缩比。
如果看一下在反射镜框架代码,似乎需要传送编码确实自动设置 - 即,如果缓冲关闭,并且没有内容长度是已知的,并且响应于HTTP / 1.1请求,块传输编码用于。但是,如果服务器IIS7,这是一个工人请求(集成模式?),代码跳转到一个本地方法 - 可能具有相同的行为,但我无法验证。
它看起来像你需要设置IIS这一点。 IIS 6在配置数据库属性AspEnableChunkedEncoding,你可以在http://msdn.microsoft.com/en-us/library/aa965021(VS.90).aspx参阅MSDN上的IIS 7映射此。这将使您设置传送编码:在你的头分块。我希望这有帮助。
虽然你设置缓冲区为false,并留出空白的内容长度,你需要确保你已禁用“动态内容压缩”功能的IIS7使分块响应工作。此外,客户端浏览器至少应该有HTTP 1.1分块..模式将不会工作HTTP 1.0
将Response.Buffer = FALSE
这将设置HTTP头“枢纽换乘编码:分块”,并发送响应每个被叫回复于