2012-03-15 46 views
0

環境:
-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也會給出相同的行爲。

有什麼想法嗎?

回答

0

我想通了這個問題,這是在我們這裏使用硬件負載均衡器的空閒超時問題的問題。負載均衡器中的默認值爲0,這意味着11分鐘,我的文件生成時間比導致此問題的時間長。增加負載均衡器空閒超時問題似乎是解決方案。

0

我在這裏懷疑的是你感覺會話鎖。我的意思是下載和生成以及使用會話進行的所有這些調用,以及會話鎖定一切,直到完成。

爲了解決這個問題,有兩個想法。

  1. 當你生成這個文件,生成它用乙醚醚線與出會話句柄需要
  2. 下載該文件從一個處理器(不是使用會話),而不是從頁面後回來。

比如你做一個處理,例如download.ashx和你做一個鏈接到您的網頁download.ashx?thisfileId=7723423&SecurityID=82jkj1288123內部處理程序,你讀這個參數,你發送的文件。但是,如果你在頁面上做這個,那麼如果你不使用會話,一種方法就是禁用這個頁面的會話,例如你在第一行聲明中設置了EnableSessionState="false"

一些類似的問題和會議的相對答案。

call aspx page to return an image randomly slow

Replacing ASP.Net's session entirely

How to deliver big files in ASP.NET Response?

+0

我不確定我是否理解你的建議,我們沒有明確地在下載文件的任何地方使用會話。您能否詳細解釋一下或者指出一些相關的鏈接? – 2012-03-16 09:19:25

+0

@NikhilVaghela當你使用一個頁面時,那麼該頁面將調用該用戶的會話,並且該會話將鎖定所有剩餘的用戶直到完成。所以,當你對用戶有一個延遲時,另一個用戶可能會因爲等待第一個用戶完成這個而花費時間。我會在答案上放置一些鏈接。 – Aristos 2012-03-16 09:35:49

+0

感謝您的幫助。原因我認爲我描述的問題與您所描述的問題有些不同,那麼您所說的是文件導出是在服務器內部工作的,這是當我從外部環境中瀏覽網站時出現的問題,這顯然是通過負載均衡器進行的。 – 2012-03-22 07:25:37