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 回答