2012-09-19 43 views
2

的情況是以下幾點:如何在長時間請求處理期間保持ASP.NET會話?

  1. 用戶點擊下載複雜的報告需要很長時間才能完成(超過會話超時)。
  2. 報告完成後,用戶單擊任何其他鏈接,但會話已過期。

用戶想知道爲什麼會話在長時間運行請求期間過期。

如何告訴ASP.NET不要在請求期間過期會話? (在請求完成後開始計數會話超時。)

更新:該解決方案應該在沒有JavaScript的情況下工作。

+1

根據報告生成/下載的情況,您可以這樣做:點擊開始報告生成/顯示「生成報告」頁面,該頁面發送ajax請求以檢查報告生成並因此保留會話。報告生成完成後,重定向到實際進行下載的頁面。 – Basic

+0

解決方案應該在沒有javascript的情況下工作。 –

+0

TN我不知道有什麼辦法可以這樣做 - 其他人可能知道某些事情,可能是通過實現自己的http請求處理程序 - 但「標準」http管道肯定會在調用代碼之前處理會話內容。您可以在頁面生命週期中提前移動您的代 - 這是MVC還是Webforms?什麼時候生成報告('Page_Load'/???) – Basic

回答

5

一個web應用程序應該及時響應請求。我認爲實際問題並不在於會話超時,而是應該將其卸載到後端的一個長時間運行的過程發生在線。

而不是讓用戶等待報告,啓動服務器上的進程生成報告並響應用戶一個響應,指示他們的請求已排隊並正在處理,並且他們的報告將當過程完成時做好準備。

用戶可以繼續瀏覽網站,使用應用程序等。完成報告後,您可以通過多種方式通知用戶。應用程序可以向他們發送電子郵件,甚至可以附加報告。或者可能有一些應用程序內通知系統(如Facebook通知程序)可能具有AJAX輪詢機制,或者(針對您關於不使用JavaScript的更新)可能更加被動,並且只需在其首頁請求後通知他們報告的完成。

無論如何,任何需要這麼長時間的進程都不應該在Web應用程序中聯機。

編輯:作爲提出的設置,你可以做到以下幾點:

  1. 當用戶請求的報告,一個記錄添加到隊列表,其中包括開始生成報告所需的任何信息。
  2. 將應用程序控制權返回給用戶。
  3. 編寫一個Windows服務或計劃的控制檯應用程序,該應用程序輪詢隊列表並處理該表中的所有報告。
  4. 隨着每個報告完成,請更新其在表格中的狀態。
  5. (可選)還可以通過服務/應用程序通知用戶(電子郵件,向在網站上驅動應用程序內通知系統的表格添加記錄等)。
  6. 用戶可以按照通知下載報告,或者只是在網站中查看他們的「報告隊列」。
+0

我知道了,但問題是預算:) –

+0

如果客戶會支付它,它會沒事的。問題不在於什麼是學術最佳解決方案,而是如何告訴ASP.NET/IIS在響應完成後開始計算會話。 –

+0

@TN:很公平,雖然我仍然認爲這樣的解決方案會比真正的解決方案更具破壞性。這與客戶說:「我們有一把錘子,而且我們需要削減一些木材,明年預算中有一臺鋸子有空間,但同時我們希望你能找到一種方法來用錘子來做到這一點。 「陳述的問題是「我怎麼用錘子砍木頭?」但是_real_問題比這個更高一步。 – David

0

需要很長時間,生成報告還是下載文件? 如果操作需要很長時間,則可能會導致頁面超時,但您的方法需要很長時間才能響應。

如果會話因用戶請求的文件需要很長時間才能下載而到期,則這是正常行爲。用戶請求該文件,直到下一個請求才顯示爲非活動狀態,會話不會刷新並且過期。

+0

幸運的是,這一代。如果下載可能會有代理緩存響應的問題。 –

0

通過在報告生成期間(可能多次)設置HttpSessionState.Timeout值,您可以手動延長特定會話的會話超時時間。

但是,這確實看起來有點笨重,但是,假設您始終能夠事先知道需要多長時間才能提高效果,並且您需要確保事後設置它,否則最終會與誰已經產生了一個報告有不同超時的訪問者誰沒有

雖然這可能工作,這當然不是最好的辦法,你真的應該把這個運行作爲一個異步任務。

+0

不幸的是,這不起作用:( –

+0

你能澄清如何/爲什麼它不工作嗎?如果從你的處理程序中調用它不起作用?如果你的網站上任何地方調用它不起作用?我不願意建議它' COS是討厭的,但如果它只是不從處理程序中工作,你可以做點擊鏈接 - >重定向到其中timeout-頁>跳轉到真正的生成報告頁面。不幸的是,我們從討厭到徹頭徹尾的fugly – Basic

+0

移動感謝提示。是否有可能從ASP.NET/IIS獲得實際正在處理的請求數量?或者我必須對它們進行計數,以便在處理所有請求後恢復超時? –

相關問題