ASP.NET下载未知大小的大文件

时间:2009-05-17 06:11:31

标签: asp.net iis

我想使用ASP.NETIIS将动态生成的文件下载到要保存的浏览器中。我不知道将生成的文件的大小。

在当前表单中,我的代码生成数据并使用HttpResponse.Write()发送到客户端。但是在最终显示保存文件对话框之前,客户端看不到大约一分钟的活动。

默认情况下,IIS缓冲要发送到客户端的输出。可以关闭它,但这对我的情况没有帮助。问题似乎是IIS选择格式化数据包的方式。

如果提前知道文件大小,那么我可以在标题中设置Content-length。如果我关闭输出缓冲,那么可能是IIS可以立即开始发送给客户端。

但由于我不知道文件大小,IIS似乎在缓冲输出直到达到某个限制(数据包大小或时间,我不知道),然后发送一个包含Transfer-encoding设置的数据包分块。

我可以自己尝试分块数据,但有没有办法让IIS执行分块,但是使用较小的数据包大小以便对话框显示更快?

6 个答案:

答案 0 :(得分:0)

你有没有偶尔打电话给HttpResponse.Flush()?

答案 1 :(得分:0)

您是否尝试将BufferOutput属性设置为false?另一个想法(我不知道是否会改变任何内容)是将文件写入OutputStream而不是调用HttpResponse.Write()

答案 2 :(得分:0)

您如何知道要传输到浏览器的文件大小?你的意思是Response.BinaryWrite?

答案 3 :(得分:0)

尝试类似的内容:

byte[] response_bytes = ...
int offset = ...

using (Stream writeStream = HttpContext.Response.OutputStream)
{
    ...
    writeStream.Write(response_bytes, offset, response_bytes.Length);
}

答案 4 :(得分:0)

截至目前,没有可接受的答案,但我可以分享我所学到的知识。

我正在使用IIS 6和.NET framework 2.0。

似乎是IIS正在缓冲输出,而不是尊重我对Flush()的调用。事实上,Flush()实际上减慢了下载速度。它似乎只是在IIS中将输出从一个进程移动到另一个进程,但效率低于不使用Flush()的情况。

测试中出现了一些有趣的行为。如果输出足够小,IIS会将内容长度添加到响应的标题中,然后发送它。

如果输出太大,大约60秒后IIS添加了transfer-encoding:chunked到标题,然后添加了相应的十六进制数并发送了它的内容。从那里开始,当我的Flush()调用发生时,输出被流式传输。

如果我自己分块数据并不重要。 IIS仍然缓冲输出,直到其缓冲区已满。

也许有更好的方法在较新的框架中设置传输编码,以便IIS 6可以更好地处理它。

另一种可能性是在Metabase.xml中尝试不同的设置。在没有进一步调查之前我没时间了。

答案 5 :(得分:0)

Response.BufferOutput = false;

return File(fileStream, contentType);