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