gpt4 book ai didi

c# - IHTTPHandler 的无缓冲输出

转载 作者:行者123 更新时间:2023-11-30 17:17:06 30 4
gpt4 key购买 nike

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

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

最佳答案

Response.Flush 方法应该通过网络发送它;但是,也有一些异常(exception)。如果 IIS 使用动态压缩,即配置为压缩动态内容,则 IIS 不会刷新流。然后是整个“分块”传输编码。如果您没有指定Content-Length,那么接收端不知道响应体有多大。这是通过分块传输编码实现的。某些 HTTP 服务器要求客户端使用包含 chunked 关键字的 Accept-Encoding 请求 header 。当您在指定全长之前开始写入字节时,其他人只是默认为分块;但是,如果您指定了自己的 Transfer-Encoding 响应 header ,它们就不会这样做。

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

... I'm loading a large number of rows from the DB, serializing, and compressing them, then sending them down the wire...

好奇您正在压缩此内容。如果您使用的是 GZIP,那么您将无法控制调用 flush 发送数据的时间和数量。此外,使用 GZIP 内容意味着接收端也可能无法立即开始读取数据。

您可能希望将记录分成 10、50 或 100 行的更小的、易于理解的 block 。压缩并发送它,然后处理下一组行。当然,现在您需要向客户端写入一些内容,以便他们知道每个压缩的行集有多大,以及何时到达末尾。见http://en.wikipedia.org/wiki/Chunked_transfer_encoding有关分块传输如何工作的示例。

关于c# - IHTTPHandler 的无缓冲输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781732/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com