将字节直接泵入Response.OutputStream-如何处理字节计数

本文关键字:字节 处理 何处理 OutputStream- Response | 更新日期: 2023-09-27 18:00:45

我需要从web服务传输大量数据流。我不想增加元数据库中的IIS缓冲区大小,而是想将字节直接泵入未缓冲的Response.OutputStream.

Response.ClearHeaders();
Response.Clear();
Response.ContentType = "text/xml";
Response.Buffer = false;
int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream);
Response.End();

这很好,但我只能知道在检索后,检索了多少字节,所以我无法设置ContentLength标头。以下行引发异常(在开始返回内容后无法添加标头):

int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream);
Response.AddHeader("Content-Length", len.ToString()); // can't do this

问题:我想真的没有太多选择。我想处理这一问题的唯一方法是引入一个中间流,例如内存流,获取流的长度,设置标题,然后将流泵入Response.Output流。还有其他想法吗?"

将字节直接泵入Response.OutputStream-如何处理字节计数

content-length不是必需的。如果您在将内容发送到响应流之前不知道它,那么就把它排除在外。浏览器仍然会很好地显示结果,但无法提供进度条或完成百分比。如果内容很小,那么这就不是主要问题。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13

在HTTP中,只要在传输之前可以确定消息的长度,就应该发送它

这是应该的,而不是必须的。

在写入数据之前,您应该修改函数以给出长度。

例如,您可以让它进行Action<long>回调,然后在写入流之前调用具有长度的回调
然后,您的页面可以通过length => Response.AddHeader("Content-Length", length.ToString())作为回调。