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

C# 将字节直接泵入Response.OutputStream-如何处理字节计数?,c#,iis,C#,Iis,我需要从web服务传输大量数据流。我不想增加元数据库中的IIS缓冲区大小,而是想将字节直接泵入unbuffered Response.OutputStream Response.ClearHeaders(); Response.Clear(); Response.ContentType = "text/xml"; Response.Buffer = false; int len = GetReport(protocolName, sourceName, reportName, pageIndex

我需要从web服务传输大量数据流。我不想增加元数据库中的IIS缓冲区大小,而是想将字节直接泵入unbuffered 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头。以下行引发异常(开始返回内容后无法添加标题):


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

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

例如,您可以让它执行
操作
回调,然后在写入流之前使用长度调用回调。

然后,您的页面可以将
length=>Response.AddHeader(“Content-length”,length.ToString())
作为回调传递。

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

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


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

是的,我可以修改函数。在您的情况下,您仍然需要在函数内部引入第二个流。如果不刷新Response.OutputStream,则无法填充它。无法在运行时刷新它将导致OutOfMemory异常。通过刷新它,您无法写入标题。也许我不该问这个问题……我想第二条流是唯一的选择。@Brett:你误解了我的答案。您可以在开始写入流之前调用
操作
。如果您有一个大小不确定的数据源(来自数据库的记录),您如何在不读取数据的情况下写入长度?当你阅读数据时,你必须把它放在某个地方。最有效的方法是将其放在Response.OutputStream中。但这需要定期刷新以避免OutofMemory异常。这是另一个问题。您可以在编写报告之前修改该方法以计算大小,具体取决于其工作方式。谢谢。在这种情况下,无法预先缓冲和确定内容。我必须在web服务调用中处理它。我知道内容会成功转移;我只是想确定我没有错过什么。
int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream);
Response.AddHeader("Content-Length", len.ToString()); // can't do this