1

我们有一个位于 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 限制了文件传输?

任何想法?

谢谢

4

0 回答 0