2009-06-23 85 views
1

我想爲我的應用程序在單獨的進程中擁有會話狀態,但我也想在用戶會話結束時運行一些代碼。 (改變一個狀態字符串,表明他們是否在線,並減少在線用戶數量。)我怎麼知道會話何時結束sessionState!= InProc

如果我的會話狀態是在Web配置中的InProc,我可以使用Session_End方法來運行此代碼,但怎麼做我這樣做,如果不是?

+0

如果是關於ASP.NET MVC,那麼在這裏檢查http://stackoverflow.com/questions/1490879/detecting-session-expiry-on-asp-net-mvc – 2014-01-10 14:05:47

回答

1

您是使用SQL狀態還是使用IIS狀態服務器服務?

如果您使用SQL狀態,您可以只檢查用戶標識。當會話超時時,該行被刪除,就是這樣。

如果您使用的是IIS狀態服務器服務,則沒有在Session_End或其他任何類似方法上執行代碼的直接方法。抱歉。

1

嘗試檢測會話何時到期時,有一點uncertainty principle。通過查詢服務器以查看它是否存在(使用AJAX或類似的方法),實際上它保持活動狀態,這通常與您想要的完全相反。

我通常通過在頁面中嵌入JavaScript代碼來實現這一點。 :

var sessionTimeout = 20; //minutes - set this programmatically server-side based on your configured timout interval 
setTimeout('timeoutAlert()', (sessionTimeout + 1) * 1000 * 60); //we add one minute buffer because this is an inaccurate process and we want to make sure they are actually timed out before we attempt to redirect 
function timeoutAlert() 
{ 
    alert("Your sesssion has ended, you will now be redirect to the login page."); 
    document.location = '/home.aspx'; 
} 

注意這個timeoutAlert()可以修改一些HTML客戶端,運行一些AJAX來執行代碼的服務器端,無論你需要做的事。如果您在頁面呈現後對服務器進行任何調用(例如,通過AJAX),則必須小心取消並重置setTimeout。

0

如果您使用的是SQL Server,那麼您可以修改DeleteExpiredSessions存儲過程來完成您的工作(即遞減在線用戶)。

或者,您可以檢查每個頁面加載的會話變量,如果它返回null,則會話結束。

你也可以把javascript檢查看看瀏覽器是否關閉,或者如果註銷按鈕被點擊了,等等......然後進行ajax調用手動關閉會話。

1

您無法分配會話結束時將始終運行的事件處理程序。有近似值,例如爲InProc會話的End事件分配事件處理程序(只有在會話正常結束時纔會運行)或更改SQL Server會話的DeleteExpiredSessions過程。