的情況是以下幾點:如何在長時間請求處理期間保持ASP.NET會話?
- 用戶點擊下載複雜的報告需要很長時間才能完成(超過會話超時)。
- 報告完成後,用戶單擊任何其他鏈接,但會話已過期。
用戶想知道爲什麼會話在長時間運行請求期間過期。
如何告訴ASP.NET不要在請求期間過期會話? (在請求完成後開始計數會話超時。)
更新:該解決方案應該在沒有JavaScript的情況下工作。
的情況是以下幾點:如何在長時間請求處理期間保持ASP.NET會話?
用戶想知道爲什麼會話在長時間運行請求期間過期。
如何告訴ASP.NET不要在請求期間過期會話? (在請求完成後開始計數會話超時。)
更新:該解決方案應該在沒有JavaScript的情況下工作。
一個web應用程序應該及時響應請求。我認爲實際問題並不在於會話超時,而是應該將其卸載到後端的一個長時間運行的過程發生在線。
而不是讓用戶等待報告,啓動服務器上的進程生成報告並響應用戶一個響應,指示他們的請求已排隊並正在處理,並且他們的報告將當過程完成時做好準備。
用戶可以繼續瀏覽網站,使用應用程序等。完成報告後,您可以通過多種方式通知用戶。應用程序可以向他們發送電子郵件,甚至可以附加報告。或者可能有一些應用程序內通知系統(如Facebook通知程序)可能具有AJAX輪詢機制,或者(針對您關於不使用JavaScript的更新)可能更加被動,並且只需在其首頁請求後通知他們報告的完成。
無論如何,任何需要這麼長時間的進程都不應該在Web應用程序中聯機。
編輯:作爲提出的設置,你可以做到以下幾點:
我知道了,但問題是預算:) –
如果客戶會支付它,它會沒事的。問題不在於什麼是學術最佳解決方案,而是如何告訴ASP.NET/IIS在響應完成後開始計算會話。 –
@TN:很公平,雖然我仍然認爲這樣的解決方案會比真正的解決方案更具破壞性。這與客戶說:「我們有一把錘子,而且我們需要削減一些木材,明年預算中有一臺鋸子有空間,但同時我們希望你能找到一種方法來用錘子來做到這一點。 「陳述的問題是「我怎麼用錘子砍木頭?」但是_real_問題比這個更高一步。 – David
需要很長時間,生成報告還是下載文件? 如果操作需要很長時間,則可能會導致頁面超時,但您的方法需要很長時間才能響應。
如果會話因用戶請求的文件需要很長時間才能下載而到期,則這是正常行爲。用戶請求該文件,直到下一個請求才顯示爲非活動狀態,會話不會刷新並且過期。
幸運的是,這一代。如果下載可能會有代理緩存響應的問題。 –
通過在報告生成期間(可能多次)設置HttpSessionState.Timeout值,您可以手動延長特定會話的會話超時時間。
但是,這確實看起來有點笨重,但是,假設您始終能夠事先知道需要多長時間才能提高效果,並且您需要確保事後設置它,否則最終會與誰已經產生了一個報告有不同超時的訪問者誰沒有
雖然這可能工作,這當然不是最好的辦法,你真的應該把這個運行作爲一個異步任務。
不幸的是,這不起作用:( –
你能澄清如何/爲什麼它不工作嗎?如果從你的處理程序中調用它不起作用?如果你的網站上任何地方調用它不起作用?我不願意建議它' COS是討厭的,但如果它只是不從處理程序中工作,你可以做點擊鏈接 - >重定向到其中timeout-頁>跳轉到真正的生成報告頁面。不幸的是,我們從討厭到徹頭徹尾的fugly – Basic
移動感謝提示。是否有可能從ASP.NET/IIS獲得實際正在處理的請求數量?或者我必須對它們進行計數,以便在處理所有請求後恢復超時? –
根據報告生成/下載的情況,您可以這樣做:點擊開始報告生成/顯示「生成報告」頁面,該頁面發送ajax請求以檢查報告生成並因此保留會話。報告生成完成後,重定向到實際進行下載的頁面。 – Basic
解決方案應該在沒有javascript的情況下工作。 –
TN我不知道有什麼辦法可以這樣做 - 其他人可能知道某些事情,可能是通過實現自己的http請求處理程序 - 但「標準」http管道肯定會在調用代碼之前處理會話內容。您可以在頁面生命週期中提前移動您的代 - 這是MVC還是Webforms?什麼時候生成報告('Page_Load'/???) – Basic