2012-02-06 140 views
3

我試圖在用戶處於非活動狀態或會話結束時(通過不活動或更重要的是,當瀏覽器關閉時)強行「登錄」。 我不想使用任何愚蠢的AJAX解決方案來執行每隔幾分鐘的「im alive」或瀏覽器關閉時調用的帖子。訪問會話結束?

我的印象是,如果你在Session中存儲了一個對象,並且你到達了Session_End事件,那麼當它結束時你將無法訪問存儲在Session中的任何東西。 但是從我做的一些測試中,看起來這可能是您獲得訪問對象的最後機會。

這是真的嗎?它可靠嗎?

在這裏使用ASP.NET 4.0。

回答

0

用於記錄超時您可以使用全局事件在超時時記錄。請參閱此鏈接以瞭解事件順序http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+0

謝謝,但你完全誤解了這個問題。我不想使用任何JavaScript計時器,也不是要求在配置 – 2012-02-06 23:11:08

+0

中更改會話/表單身份驗證超時屬性相關的任何內容。請參閱修訂後的答案 – PAULDAWG 2012-02-06 23:13:43

3

通常有兩件事完成。

第一個是javascript定時器被添加到客戶端,而不是心跳,而是作爲提醒。如果他們接近會議結束,那麼它只是說「會議即將結束,你還在嗎?」如果是這樣,那麼它會執行「愚蠢」的帖子來確保服務器保持會話進行。這純粹是爲了讓你的用戶很好。

第二個問題(和你的問題的重點)是你把一些東西放在session_end中以清理會話。可靠?以及當時最多

如果應用程序池被回收,Session_End將不會運行。但是,假設應用程序池是好的,那麼會在會話過期時執行。應用程序池可以回收的原因很多,從應用程序崩潰到超出內存使用,僅僅因爲自上次重置以來已經有一段時間了。這可以在IIS中配置。

我會信任session_end嗎?不,不是100%。當然,我不會在會話對象中放置任何內容,無論如何都要求我相信它。

+0

謝謝克里斯。嗯。我不想使用任何JavaScript黑客或回調。必須儘可能在服務器端完成。有什麼方法可以讓我在會話中「關閉」用戶?我想記錄用戶註銷的時間(除了註銷註銷之外,當會話結束時)。在後臺運行一個腳本來檢查每個腳本經常不會告訴您網站上是否存在活動,或者不是用戶。 – 2012-02-06 23:15:09

+0

真的,你所能做的只是* hope * session_end實際運行。對於那些不需要的情況,您需要一個清理過程服務器端,將用戶標記爲已註銷。爲了支持這一點,您需要記錄每次他們在您的網站上執行頁面加載或其他操作,以確保您不會記錄正在使用該站點的人員。 – NotMe 2012-02-06 23:17:17

+1

謝謝克里斯。我的意思是,從我做的測試 - 我每分鐘都會過期。我在會話中存儲了一個用戶ID。我在網站上玩了一分多鐘,並且會話沒有結束。當我停止玩耍時,那個分鐘符號會彈出,Session_End會踢進來,並且我可以在會話中訪問用戶ID。然後,我可以做我想在這裏(即清理)。但對於那些session_end沒有命中的情況,我想我可以每天運行一個SQL作業來更新「loggedOffAt」字段,從登錄時間開始+ x分鐘。對此有何想法? – 2012-02-06 23:22:38