2012-12-10 84 views
0

我有一個應用程序可以生成包含特定信息的50,000條記錄。一旦生成並保存到數據庫中,用戶可以隨時從控制面板中以csv格式下載記錄。正在下載可能需要很長時間才能請求的文件

我得到的問題是它可能需要長達40多秒才能生成CSV。但在完成處理之後,瀏覽器不再嘗試下載它。相反,它只是掛起。

我目前設置了一個很高的超時值,所以處理過程不會超時。我還需要它隨時生成,因爲它需要包含相關的實時數據。

有誰知道爲什麼它不會在等待文件生成後下載?

繼承人我產生一次迴應標題:

//**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

來自MSDN:備註 - Clear方法不會清除標題信息。試試'Response.ClearHeaders()'。 – 2012-12-10 17:33:02

+0

這就是對的。在編寫csv之前,我只想確保回覆清晰。據我所知,清除將刪除已寫入響應的任何內容? – Base33

+0

是的,但通常標題還會有潛藏在你想要擺脫的奇怪事物。 – 2012-12-10 17:35:58

回答

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服務器的響應緩衝區,具體取決於您的特定平均記錄大小。我也會對生產做一些其他的改變,但這應該足以讓你指向正確的方向。

+0

完美!我想我有一個「我從來沒有想過這個!」時刻:-) – Base33

+0

與生成它然後寫入緩衝區相比,它還將處理時間縮短到3秒左右。 – Base33

相關問題