我们有一个位于 IIS7 上的 ASP .NET Web 服务器。为了让我们的服务器能够将大文件(比如 30-50MB)传输到 Web 客户端,我们实现了 Response.Output.Write 算法,如下所示:http: //support.microsoft.com/ ?kbid= 812406。
这是我们的代码片段:
long offset = 0, cb = info.AudioStream.Length;
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ContentType = "audio/wav";
context.Response.Cache.SetNoStore();
context.Response.AddHeader("Content-Length", cb.ToString());
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + info.RecordingId + ".wav");
context.Response.Buffer = false;
context.Response.BufferOutput = false;
context.Response.Flush();
info.AudioStream.Seek(offset, SeekOrigin.Begin);
byte[] buffer = new byte[1024 * 1024];
long total = 0;
int count;
Tracer.TraceInfo(true, "WaveHandler::ProcessRequest; Before loop.");
while (context.Response.IsClientConnected &&
total < cb &&
(count = info.AudioStream.Read(buffer, 0, (int)Math.Min(buffer.Length, cb - total))) != 0)
{
Tracer.TraceInfo(true, "WaveHandler::ProcessRequest; Before 'Write'; Count: " + count);
context.Response.OutputStream.Write(buffer, 0, count);
Tracer.TraceInfo(true, "WaveHandler::ProcessRequest; After 'Write'; Total: " + total);
total += count;
}
Tracer.TraceInfo(true, "WaveHandler::ProcessRequest; After loop.");
context.Response.Flush();
问题是,在同一台 Windows 7 客户端 PC 上,使用 firefox 15.0 传输约 35MB 文件需要 5 秒,但使用 IE9 进行相同操作需要约 3 分 30 秒。在另一台装有 IE8 的 XP 客户端 PC 上,传输相同的 ~35MB 文件需要 10 秒。
我们尝试使用传输缓冲区大小(从 4kB 到 1MB)或在循环中放置一个“Response.Flush()”,但 IE9 的性能总是很差。
我们不知道哪一端需要调整:Web 服务器端还是客户端?
更新: 客户端的网页用于播放传输的音频文件。IE 和 Firefox 的区别在于,Windows Media Player(嵌入式)用于在 IE 中播放,而当 != IE 时使用音频标签。会不会是 WMP 限制了文件传输?
任何想法?
谢谢