環境:
-SharePoint 2010基於基礎
-Claim認證
-Execution在web.config中超時設置爲3600
Response.WriteFile函數失敗,並給出了504網關超時
概述:
我們有一個excel導出功能,我們連接到AD和SQL數據庫以獲取用戶及其相關數據,用於Active Directory中的特定組織單位(OU)。 我們在公元的OU中已經有大約1400個用戶。我們正在使用Open和Closed xml生成excel文件,該文件工作正常,需要大約11-14分鐘的時間在服務器上的以下路徑上生成一個文件: C:\ inetpub \ wwwroot \ wss \ VirtualDirectories \ VirtualDirectyrName \ Excel \ FileName.xlsx
生成文件後立即生成一段代碼,它將從服務器讀取文件並將其轉儲到輸出蒸汽上,並在瀏覽器中向最終用戶顯示一個文件ope-save作爲對話框。
問題描述:
當組織有較少的用戶的數量,它並不會超過5-6 minteus產生於服務器上的文件,下面的代碼段成功地下載瀏覽器上的文件。但是,當上面提到的我們有1400個用戶的OU時,reponse.writefile函數會失敗,並且在瀏覽中我們會看到'Browse can not display this page'(當fiddler開啓時,我們發現它給出了 - http 504錯誤)。令人驚訝的是,如果我們從服務器本身執行此導出操作(即瀏覽服務器上的網站),它將毫無問題地下載。
protected void lnkbtnDownloadFile_Click(object sender, EventArgs e)
{
String fileName = @"C:\inetpub\wwwroot\wss\VirtualDirectories\VirtualDirectyrName\Excel\540KBFileWhichFails.xlsx";
//File size is hardly ~500 KB
//Wait for around 12 minutes, to mimic a scenario of file generation which takes time on staging and prod. environment.
System.Threading.Thread.Sleep(720000);
try
{
if (fileName != "")
{
var file = new FileInfo(fileName);
if (file.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);
Response.End();
}
else
Response.Write("This file does not exist.");
}
}
catch (Exception ex)
{
//This would usually give thread aboart exception but thats expected.
}
}
我們在ULS日誌中沒有看到特定於此行爲的事件日誌中的任何錯誤。 請注意,response.TransmitFile也會給出相同的行爲。
有什麼想法嗎?
我不確定我是否理解你的建議,我們沒有明確地在下載文件的任何地方使用會話。您能否詳細解釋一下或者指出一些相關的鏈接? – 2012-03-16 09:19:25
@NikhilVaghela當你使用一個頁面時,那麼該頁面將調用該用戶的會話,並且該會話將鎖定所有剩餘的用戶直到完成。所以,當你對用戶有一個延遲時,另一個用戶可能會因爲等待第一個用戶完成這個而花費時間。我會在答案上放置一些鏈接。 – Aristos 2012-03-16 09:35:49
感謝您的幫助。原因我認爲我描述的問題與您所描述的問題有些不同,那麼您所說的是文件導出是在服務器內部工作的,這是當我從外部環境中瀏覽網站時出現的問題,這顯然是通過負載均衡器進行的。 – 2012-03-22 07:25:37