Session End 執行機制的一些細節

2022-03-05 19:43:03 字數 1662 閱讀 9247

1.首先是如何激發session_end()方法

因為這個方法只支援inproc(程序內的)型別的session,所以我們將web.config配置如下:

注:timeout的基本單位是:分

2.為什麼執行了session.abandon(),但是卻仍然可以從session中取到值?

為什麼在session_end()中,無法獲得httpcontext.current物件?

按示例說明:

aspx部分

aspx.cs部分

protected void page_load(object sender, eventargs e)

this.lblmsg.text = convert.toint32(session["state"]).tostring();

}protected void btntest_click(object sender, eventargs e)

global.ascx部分

void session_end(object sender, eventargs e) 

catch

}執行測試:

1)執行程式發現,點選了「登出session」按鈕後,即使重新設定lblmsg.text,輸出的值也仍然為1,並沒有像我們預期認為的那樣,應該是session被登出,然後通過convert.toint32對null值的轉換後,輸出0。

2)現在給aspx頁新增乙個新的button控制項,重新執行程式,依次點選「登出session」 - 「回發」,發現在第2次點選後,結果輸出0。通過除錯也發現在呼叫session.abandon()後,的確進到了session_end()方法。

注:通過除錯發現,第一步和第二步均可以激發session_end()方法。

除錯分析:

1)前置條件:點選「登出session」按鈕

給btntest_click()內的**設定斷點,通過除錯可以發現,其中執行的順序並

不是:從session.abandon() - 到session_end() - 執行完之後再返回到btntest_click()中繼續執行其他事件

而是:將btntest_click()中所有事件執行過後 - 再轉去執行session_end()

2)前置條件:無

在 session_end()中設定斷點,然後正常啟動頁面,因為我將sessionstate的timeout設定為1分鐘,所以乾脆什麼都不做,等1分 鐘過去時,發現程式自動進到session_end(),執行到這裡思路應該就比較清楚了,正如cnblogs很多貼子中所說的 「session_end()是乙個在伺服器內部激發的事件處理函式,它是基於乙個伺服器內部的計時器的」,因為在激發該事件時伺服器上並沒有相關的 httprequest物件,所以也不存在httpcontext這個概念。至於為什麼客戶端需要通過再一次request回發請求,才會得到0,根據上 面的第一步來看也就很明白了。

總結:

1)要激發session_end(),必須正確配置web.config,如

2)session_end()中是無法獲得httpcontext物件的。

3)執行session.abandon()後,客戶端必須至少有一次請求,才能正確反應session的狀態。

session執行機制

session機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表 的結構 也可能就是使用 雜湊表 來儲存資訊。當程式需要為某個客戶端的請求建立乙個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了乙個session標識 稱為sessionid,如果已包含乙個sessionid則說明...

try catch finally執行機制

finally的執行 如下的程式所示,注釋中是執行的順序 public class test public static string test finally public static string test1 finally其實是僅在return 語句執行前執行,如果return 乙個函式,那...

runtime執行機制

這篇文章主要介紹的是runtime是什麼以及怎麼用!希望對讀者有所幫助!第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了ru...