我可以简单地设置 Transfer-Encoding 标头?

会打电话 Response.Flush() 在某些时候导致这种情况隐式发生?


编辑
不,我不能打电话 Response.Headers.Add("Transfer-Encoding","anything"); 那抛出。

还有其他建议吗?


有关的:
在 ASP.NET 中启用分块传输编码

有帮助吗?

解决方案

<强> TL; DR: 指定内容长度是实现一个快速的第一个字节的最佳方式;你会允许在TCP分块而不是HTTP水平。如果你不知道内容长度,因为它使用传输编码分块写入的输出流设置context.Response.BufferOutputfalse将发送输出。


你为什么要设置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,您可以在 MSDN 上查看 IIS 7 的映射: http://msdn.microsoft.com/en-us/library/aa965021(VS.90).aspx. 。这将使您能够设置传输编码:在你的标题中分块。我希望这有帮助。

虽然你设置缓冲区为false,并留出空白的内容长度,你需要确保你已禁用“动态内容压缩”功能的IIS7使分块响应工作。此外,客户端浏览器应至少有HTTP 1.1 ..分块模式就不会被工作HTTP 1.0

将Response.Buffer =假

这将设置HTTP头“枢纽换乘编码:分块”,并发送响应每个被叫回复于

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top