我想从一个流式传输数据IHttpHandler
班级。我从数据库加载大量行,序列化并压缩它们,然后通过网络发送它们。另一方面,我希望我的客户端能够在服务器完成所有对象的序列化之前解压缩和反序列化数据。
我在用着context.Response.OutputSteam.Write
写入我的数据,但输出数据似乎在发送到客户端之前被放入缓冲区中。有没有办法避免这种缓冲?
The Response.Flush
方法应该将其发送到网络上;然而,也有一些例外。如果 IIS 使用动态压缩,即配置为压缩动态内容,则 IIS 将不会刷新流。然后是整个“分块”传输编码。如果您没有指定Content-Length
那么接收端不知道响应体有多大。这是通过分块传输编码来完成的。某些 HTTP 服务器要求客户端使用Accept-Encoding
包含 chunked 关键字的请求标头。其他的只是在指定完整长度之前开始写入字节时默认为分块;但是,如果您指定了自己的,他们不会这样做Transfer-Encoding
响应头。
在 IIS 7 和禁用压缩的情况下,Response.Flush
那么应该总是能达到目的,对吗?并不真地。 IIS 7 可以有许多模块来拦截请求和响应并与之交互。我不知道默认情况下是否安装/启用了任何一个,但您仍然应该知道它们可以影响您想要的结果。
...我正在从数据库加载大量行,序列化,然后压缩他们,然后将他们发送到电线上......
很好奇您正在压缩此内容。如果您使用GZIP,那么您将无法通过调用flush 来控制发送数据的时间和数量。另外,使用 GZIP 内容意味着接收端也可能无法立即开始读取数据。
您可能希望将记录分成更小的、易于理解的 10、50 或 100 行块。压缩并发送它,然后处理下一组行。当然,现在您需要向客户端写入一些内容,以便他们知道每个压缩行集有多大,以及它们何时到达末尾。看http://en.wikipedia.org/wiki/Chunked_transfer_encoding http://en.wikipedia.org/wiki/Chunked_transfer_encoding有关分块传输如何工作的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)