下载可能需要很长时间才能请求的文件

时间:2012-12-10 17:29:43

标签: c# asp.net http

我有一个应用程序,它生成包含特定信息的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();

2 个答案:

答案 0 :(得分: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服务器的响应缓冲区,具体取决于您的特定平均记录大小。我也会在制作中做一些其他改动,但这足以指出你正确的方向。

答案 1 :(得分:0)

也许您需要增加保持活动超时。通常 - 您的服务器应该更快地回复。

How to change the default keep-alive time-out value in Internet Explorer