如何在ASP.NET响应中将Transfer-Encoding设置为chunked,显式或隐式?

Che*_*eso 15 asp.net http transfer-encoding chunked-encoding

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

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


编辑
不,我不能打电话给Response.Headers.Add("Transfer-Encoding","anything"); 那个投掷.

还有其他建议吗?


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

Eam*_*nne 22

TL; DR:指定内容长度是实现快速第一个字节的最佳方式; 你将允许在TCP而不是HTTP级别进行分块.如果你不知道内容长度,设置context.Response.BufferOutputfalse将发送输出,因为它使用chunked transfer-encoding写入输出流.


你为什么要设置Transfer-Encoding: chunked?分块传输基本上是一种解决方法,允许发送事先不知道其内容长度的文档.ASP.NET,但是,在默认情况下缓存整个输出,因此知道整体内容长度.

当然,HTTP是通过TCP分层的,在场景后面,无论如何通过将单片HTTP响应分成数据包来"分块" - 这意味着如果你预先指定内容长度并禁用输出缓冲,你将获得最佳延迟,无需HTTP级别的分块. 因此,当您知道内容长度时,不需要HTTP级别的块来提供快速的第一个字节.

虽然我不是HTTP的专家,我实现了一个简单的流媒体服务器与寻求支持,动态压缩,缓存等,以及我有一个快速的第一个字节的相关性合理把握-和分块一般是劣质如果你知道内容长度的选项- 几乎可以肯定ASP.NET不会让你手动设置它 - 这是没有必要的.

但是,如果您在传输之前知道HTTP内容长度并且缓冲太昂贵,则关闭输出缓冲,并且可能服务器将根据需要使用分块传输编码.

服务器何时使用分块传输编码?我刚测试过,实际上如果context.Response.BufferOutput设置为false,并且未设置内容长度,则响应被分块; 在我对1.7MB内容编码的完全非科学快速测试中,这样的响应大1-2%:gzip xml文档.由于gzip依赖于上下文来减少冗余,我预计压缩率会受到更大的影响,但似乎分块并不一定会大大降低压缩率.

如果看一下在反射镜框架代码,似乎需要传送编码确实自动设置 - 即,如果缓冲关闭,并且没有内容长度是已知的,并且响应于HTTP/1.1请求,块传输编码用于.但是,如果服务器是IIS7并且这是一个工作者请求(?集成模式?),代码将分支到本机方法 - 可能具有相同的行为,但我无法验证.

  • @Eamon,Chunked转移不是一种解决方法,它们是一种功能.我想你知道这一点,但是当内容的大小未知且在写入第一个响应字节时可能很大,那么它是不正确的,有潜在危险,如果ASPNET尝试缓存整个内容,将导致性能不佳发送前的响应.关于BufferOutput的使用 - 你能引用你"刚检查过"的来源吗?你的意思是你测试过吗?我也观察到了这种行为.我正在寻找的是有记录的描述.Response.Flush()可以做到吗?等等 (8认同)