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

C# 下载可能需要很长时间才能请求的文件,c#,asp.net,http,C#,Asp.net,Http,我有一个应用程序,可以生成50000条包含特定信息的记录。一旦生成并保存到数据库,用户可以随时从控制面板下载csv格式的记录 我遇到的问题是,生成CSV可能需要40秒以上的时间。但当它完成处理时,浏览器不再尝试下载它。相反,它只是挂起 我目前设置了一个高超时值,因此处理不会超时。我还需要它在运行中生成,因为它需要包含相关的实时数据 有人知道为什么在等待文件生成后它不下载吗 以下是我在生成后响应的标题: //**generate the csv as string here, and then..

我有一个应用程序,可以生成50000条包含特定信息的记录。一旦生成并保存到数据库,用户可以随时从控制面板下载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();

也许您需要增加保持活动超时。一般来说,您的服务器应该更快地响应


也许您需要增加保持活动超时时间。一般来说,您的服务器应该更快地响应


不要预先生成整个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秒左右。