C# 下载可能需要很长时间才能请求的文件
我有一个应用程序,可以生成50000条包含特定信息的记录。一旦生成并保存到数据库,用户可以随时从控制面板下载csv格式的记录 我遇到的问题是,生成CSV可能需要40秒以上的时间。但当它完成处理时,浏览器不再尝试下载它。相反,它只是挂起 我目前设置了一个高超时值,因此处理不会超时。我还需要它在运行中生成,因为它需要包含相关的实时数据 有人知道为什么在等待文件生成后它不下载吗 以下是我在生成后响应的标题:C# 下载可能需要很长时间才能请求的文件,c#,asp.net,http,C#,Asp.net,Http,我有一个应用程序,可以生成50000条包含特定信息的记录。一旦生成并保存到数据库,用户可以随时从控制面板下载csv格式的记录 我遇到的问题是,生成CSV可能需要40秒以上的时间。但当它完成处理时,浏览器不再尝试下载它。相反,它只是挂起 我目前设置了一个高超时值,因此处理不会超时。我还需要它在运行中生成,因为它需要包含相关的实时数据 有人知道为什么在等待文件生成后它不下载吗 以下是我在生成后响应的标题: //**generate the csv as string here, and then..
//**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();
也许您需要增加保持活动超时。一般来说,您的服务器应该更快地响应
也许您需要增加保持活动超时时间。一般来说,您的服务器应该更快地响应
不要预先生成整个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服务器的响应缓冲区。我也会在生产中做一些其他更改,但这应该足以为您指明正确的方向。不要提前生成整个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服务器的响应缓冲区。我还想在生产中做一些其他更改,但这应该足以为您指明正确的方向。来自MSDN:Comments-Clear方法不会清除标题信息。尝试
Response.ClearHeaders()
。没错。我只是想在我写csv之前确保回复是清晰的。据我所知,clear会删除已写入响应的任何内容?是的,但通常标题中也会隐藏一些奇怪的东西,您可能希望将其删除。我会尝试一下。另一种选择是使用带有计时器的更新面板,该面板将与服务器一起检查文件是否已生成。更新面板会说“请稍候,正在生成文件。”来自MSDN:Comments-Clear方法不会清除标题信息。尝试Response.ClearHeaders()
。没错。我只是想在我写csv之前确保回复是清晰的。据我所知,clear会删除已写入响应的任何内容?是的,但通常标题中也会隐藏一些奇怪的东西,您可能希望将其删除。我会尝试一下。另一种选择是使用带有计时器的更新面板,该面板将与服务器一起检查文件是否已生成。更新面板会说“请稍候,正在生成文件。”太好了!我想我有一个“我从来没有想过”的时刻:-)与生成它然后写入缓冲区相比,它还将处理时间减少到3秒左右。太棒了!我想我有一个“我从来没有想过”的时刻:-)与生成它然后写入缓冲区相比,它还将处理时间减少到3秒左右。