0

特定の情報を含む 50,000 レコードを生成するアプリケーションがあります。生成されてデータベースに保存されると、ユーザーはいつでもコントロール パネルからレコードを csv としてダウンロードできます。

私が得ている問題は、CSV を生成するのに最大 40 秒以上かかることです。しかし、その処理が完了するまでに、ブラウザーはダウンロードを試みなくなります。代わりに、ハングするだけです。

現在、タイムアウト値を高く設定しているため、処理がタイムアウトしません。また、関連するライブデータを含める必要があるため、オンザフライで生成する必要があります。

ファイルが生成されるのを待ってからダウンロードしない理由を知っている人はいますか?

生成された後に応答するヘッダーは次のとおりです。

//**generate the csv as string here, and then...**
Response.Clear();
Response.AddHeader("content-disposition", string.Format("attachment;filename=file_{0}.csv", batchId));
Response.ContentType = "text/csv";
Response.Write(csv);
Response.End();
4

2 に答える 2

4

前もって csv ファイル全体を生成しないでください。データベースから取得したレコードをストリームに書き込みます。次のようなコードが必要です。

Response.Clear();
Response.AddHeader("content-disposition", string.Format("attachment;filename=file_{0}.csv", batchId));
Response.ContentType = "text/csv";

using (SqlDataReader rdr= GetDataForCSV())
{
    int i = 0;
    while (rdr.Read())
    {
       Response.Write(CSVFromIDataRecord(rdr));
       Response.Write("\n");
       if (i % 50 == 0)
       {
           //flush the output stream every now and then
           Response.Flush();
       }
    }
    rdr.Close();
}
Response.End();

私はこの正確なコードを支持していないことに注意してください。たとえば、この方法で SqlDataReader を使用すると、質問の範囲外になる問題がいくつかあります。また、特定の平均レコード サイズに応じて、IIS サーバーの応答バッファーを十分に活用できるように、各フラッシュ呼び出し間のレコード数を設定することもできます。プロダクションで他の変更も加えますが、これで正しい方向に進むことができます。

于 2012-12-10T17:47:10.213 に答える
0

キープアライブのタイムアウトを増やす必要があるかもしれません。一般に、サーバーはより速く応答するはずです。

Internet Explorer で既定のキープアライブ タイムアウト値を変更する方法

于 2012-12-10T17:38:27.353 に答える