1

IIS7 上にある ASP .NET Web サーバーがあります。サーバーが大きなファイル (30 ~ 50 MB とします) を 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 で同じ操作を行うと ~3m30s かかることです。IE8 を搭載した別の XP クライアント PC では、同じ ~35MB のファイルを転送するのに 10 秒かかります。

送信バッファー サイズ (4kB から 1MB) を調整するか、ループ内に「Response.Flush()」を配置しようとしましたが、IE9 では常に同じようにパフォーマンスが低下します。

Web サーバー側とクライアント側のどちらを調整する必要があるかわかりません。

更新: クライアントの Web ページは、送信されたオーディオ ファイルの再生に使用されます。IE と Firefox の違いは、IE での再生には Windows Media Player (組み込み) を使用し、!= IE の場合はオーディオ タグを使用することです。WMP がファイル転送を抑制している可能性はありますか?

何か案が?

ありがとう

4

0 に答える 0