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

时间:2011-07-01 02:09:58

标签: c# iis

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

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流。还有其他想法吗?'

2 个答案:

答案 0 :(得分:4)

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

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

  

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

那应该是,而不是必须。

答案 1 :(得分:0)

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

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