我需要从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流。还有其他想法吗?'
答案 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())
作为回调。