IHTTPHandler的无缓冲输出

时间:2011-07-21 19:38:24

标签: c# .net ihttphandler

我想从IHttpHandler类传输数据。我正在从DB加载大量行,序列化并压缩它们,然后将它们发送到网络中。另一方面,我希望我的客户端能够在服务器完成序列化所有对象之前解压缩和反序列化数据。

我正在使用context.Response.OutputSteam.Write来编写我的数据,但在发送到客户端之前,输出数据似乎仍然被放入缓冲区。有没有办法避免这种缓冲?

2 个答案:

答案 0 :(得分:2)

Response.Flush方法应该将其发送到网络;但是,有一些例外。如果IIS使用动态压缩,即它配置为压缩动态内容,则IIS不会刷新流。然后是整个'chunked'传输编码。如果您尚未指定Content-Length,则接收端不知道响应正文的大小。这是通过分块传输编码实现的。某些HTTP服务器要求客户端使用包含chunked关键字的Accept-Encoding请求标头。其他人只是在指定全长之前开始写字节时默认为分块;但是,如果您指定了自己的Transfer-Encoding响应标头,则不会执行此操作。

在IIS 7和压缩功能被禁用的情况下,Response.Flush应该随时可以解决问题,对吧?并不是的。 IIS 7可以有许多模块拦截请求和响应并与之交互。我不知道是否有任何默认安装/启用,但你仍然应该知道它们可以影响你想要的结果。

  

...我正在从数据库加载大量行,序列化, 压缩 ,然后将它们发送到线路......

很好您正在压缩此内容。如果您正在使用GZIP,那么您将无法通过调用flush来控制何时以及发送多少数据。另外,使用GZIP内容意味着接收端也可能无法立即开始读取数据。

您可能希望将记录分成10,50或100行的较小,易消化的卡盘。压缩并发送它,然后处理下一组行。当然,现在您需要向客户端写一些东西,以便他们知道每个压缩行集的大小,以及它们何时到达终点。有关分块传输如何工作的示例,请参阅http://en.wikipedia.org/wiki/Chunked_transfer_encoding

答案 1 :(得分:0)

您可以使用context.Response.Flush()context.Response.OutputSteam.Flush()强制立即写入缓冲内容。