4

asp.netアプリケーションにファイルダウンロード機能を実装しようとしています。このアプリケーションは、さまざまなファイルをダウンロードするために、たとえば約200人のユーザーが同時に使用します。IIS 7でホストされます。複数の要求が同時に発生するため、アプリケーションサーバーがクラッシュしないようにします。

ループでContext.Response.Flush()を呼び出すことにより、それまでに読み取ったであろうすべてのファイルデータをフラッシュしているので、アプリケーションのメモリ使用量が均一に保たれると想定しています。現在のコードに対して他にどのような最適化を行うことができますか、またはこのようなシナリオで他にどのようなアプローチを使用する必要がありますか?

要求はさまざまなファイルに対するものであり、ファイルサイズは100KBから10MBの間のどこでもかまいません。

私の現在のコードは次のようなものです:

FileStream inStr = null;
byte[] buffer = new byte[1024];
String fileName = @"C:\DwnldTest\test.doc";
long byteCount; inStr = File.OpenRead(fileName);

Response.AddHeader("content-disposition", "attachment;filename=test.doc");

while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0)
{
    if (Context.Response.IsClientConnected)
    {
        Context.Response.ContentType = "application/msword";
        //Context.Response.BufferOutput = true;                    
        Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
        Context.Response.Flush();                    
    }
}
4

4 に答える 4

1

Response.TransmitFileファイルを送信するときにサーバーメモリを節約するために使用できます。

Response.ContentType = "application/pdf";

Response.AddHeader("content-disposition", "attachment; filename=testdoc.pdf");

Response.TransmitFile(@"e:\inet\www\docs\testdoc.pdf");

Response.End();
于 2012-10-23T14:00:28.990 に答える
0

コード例では、inStr を閉じたり破棄したりしていません。それはパフォーマンスに影響を与える可能性があります。

これを行う別のより簡単な方法は、組み込みメソッドを使用することです。

書き込みファイル

すでに最適化されている必要があり、ファイルの開閉を処理します。

于 2012-10-23T13:43:16.873 に答える
0

クラスを使用FileSystemWatcherしてファイルが変更されたかどうかを確認し、そのような変更が検出されたときにのみメモリに読み込みたい場合があります。残りの時間は、すでにメモリに格納されているバイト配列を返すだけです。HttpResponse.WriteFileメソッドがそのようなファイル変更の変更に敏感かどうか、または常に指定されたパスからファイルを読み取るかどうかはわかりませんが、フレームワークによってそのまま提供されるため、これも使用するのに適したオプションのようです。

于 2012-10-23T13:51:57.403 に答える
0

既存のファイルをクライアントに送信しているため、HttpResponse.TransmitFile(http://msdn.microsoft.com/en-us/library/12s31dhy.aspx) の使用を検討してください。

.NET コードを見ると、ASP.NET プロセスでファイルを読み書きするのではなく、ファイルの書き込みを IIS に転送するようです。HttpResponse.WriteFile(string, false)HttpResponse.Write(string)同じことをしているようです。

ファイル送信が IIS に中継されていることを確認するには、HttpResponse.Outputプロパティで - タイプがHttpWriter. HttpWriter._buffers配列には新しい要素が含まれているはずですHttpFileResponseElement)。

もちろん、キャッシュがシナリオに適しているかどうかを常に調査し、使用されているかどうかをテストする必要があります。

于 2012-10-23T14:08:03.543 に答える