私の職場には、次のコードを使用してファイルのダウンロードを実行するASP.NETページがあります。ファイルはzipアーカイブから直接取得されるため、Request.TransmitFile()ではなくこれを使用します。
private void DownloadStream(Stream stream)
{
int bytesRead;
int chunkSize = 1048576; //1MB
byte[] readBuffer = new byte[chunkSize];
while ( (bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
if (!Response.IsClientConnected)
break;
Response.OutputStream.Write(readBuffer, 0, bytesRead);
Response.Flush();
}
}
httpRuntimeexecutionTimeout設定の妥当な値を決定しようとしています。送信されるファイルのサイズは最大1GBであり、一部のユーザーはWebサーバーへのパイプ*が非常に遅い(64K回線を考えてください)。これらのユーザーに接続のリセットを経験させたくありません。ただし、サイトの残りの部分については、妥当なタイムアウト値を維持する必要があります。
この特定のページに対してのみexecutionTimeout設定を定義する(またはそのページに対して無制限にする)方法はありますか?推奨されるアプローチは何ですか?ファイルを提供するためにまったく異なる方法(FTPなど)を使用したほうがよいと思いますが、その選択をする自由はありません。私たちにできることは、サイトのコードを変更することだけです。
また、これらのダウンロードは送信する前に圧縮する必要があると思いますが、それは別の問題です。
*トピック外の質問:「遅いパイプ」は厄介な混合比喩ですか?代わりに「小さなパイプ」と言うべきかもしれませんが、この文脈ではそれは私には奇妙に聞こえます。意見?