當(dāng)前位置:
首頁(yè) >
关于Session_End()运行机制的一些细节!
發(fā)布時(shí)間:2025/7/25
43
豆豆
生活随笔
收集整理的這篇文章主要介紹了
关于Session_End()运行机制的一些细节!
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.首先是如何激發(fā)Session_End()方法
因?yàn)檫@個(gè)方法只支持InProc(進(jìn)程內(nèi)的)類型的Session,所以我們將Web.config配置如下:
<sessionState?timeout="1"?mode="InProc">
</sessionState> 注:timeout的基本單位是:分
2.為什么執(zhí)行了Session.Abandon(),但是卻仍然可以從Session中取到值?
?? 為什么在Session_End()中,無(wú)法獲得HttpContext.Current對(duì)象?
按示例說(shuō)明:
aspx部分
????<form?id="form1"?runat="server">
????????<div>
????????????<asp:Literal?ID="lblMsg"?runat="server"></asp:Literal>
????????????<br?/>
????????????<asp:Button?ID="btnTest"?runat="server"?Text="注銷Session"?OnClick="btnTest_Click"?/>????????????
????????????<asp:Button?ID="Button1"?runat="server"?Text="回發(fā)"?/>
????????</div>
????</form>
aspx.cs部分
????protected?void?Page_Load(object?sender,?EventArgs?e)
????{
????????if?(!Page.IsPostBack)
????????{
????????????this.Session["state"]?=?1;
????????}
????????this.lblMsg.Text?=?Convert.ToInt32(Session["state"]).ToString();
????}
????protected?void?btnTest_Click(object?sender,?EventArgs?e)
????{
????????this.Session.Abandon();
????????//?重新設(shè)置lblMsg.Text
????????this.lblMsg.Text?=?Convert.ToInt32(Session["state"]).ToString();
????}
Global.ascx部分
????void?Session_End(object?sender,?EventArgs?e)?
????{
????????try
????????{
????????????HttpContext.Current.Response.Write("調(diào)用Session_End()方法");
????????}
????????catch
????????{
????????????throw?new?Exception("捕獲異常");
????????}
????}
運(yùn)行測(cè)試:
1)運(yùn)行程序發(fā)現(xiàn),點(diǎn)擊了“注銷Session”按鈕后,即使重新設(shè)置lblMsg.Text,輸出的值也仍然為1,并沒(méi)有像我們預(yù)期認(rèn)為的那樣,應(yīng)該是Session被注銷,然后通過(guò)Convert.ToInt32對(duì)NULL值的轉(zhuǎn)換后,輸出0。
2)現(xiàn)在給ASPX頁(yè)添加一個(gè)新的BUTTON控件,重新運(yùn)行程序,依次點(diǎn)擊“注銷Session” - “回發(fā)”,發(fā)現(xiàn)在第2次點(diǎn)擊后,結(jié)果輸出0。通過(guò)調(diào)試也發(fā)現(xiàn)在調(diào)用Session.Abandon()后,的確進(jìn)到了Session_End()方法。
注:通過(guò)調(diào)試發(fā)現(xiàn),第一步和第二步均可以激發(fā)Session_End()方法。
調(diào)試分析:
1)前置條件:點(diǎn)擊“注銷Session”按鈕
給btnTest_Click()內(nèi)的代碼設(shè)置斷點(diǎn),通過(guò)調(diào)試可以發(fā)現(xiàn),其中執(zhí)行的順序并
不是:從Session.Abandon() - 到Session_End() - 執(zhí)行完之后再返回到btnTest_Click()中繼續(xù)執(zhí)行其他事件
而是:將btnTest_Click()中所有事件執(zhí)行過(guò)后 - 再轉(zhuǎn)去執(zhí)行Session_End()
2)前置條件:無(wú)
在Session_End()中設(shè)置斷點(diǎn),然后正常啟動(dòng)頁(yè)面,因?yàn)槲覍essionState的timeout設(shè)置為1分鐘,所以干脆什么都不做,等1分鐘過(guò)去時(shí),發(fā)現(xiàn)程序自動(dòng)進(jìn)到Session_End(),執(zhí)行到這里思路應(yīng)該就比較清楚了,正如cnblogs很多貼子中所說(shuō)的“Session_End()是一個(gè)在服務(wù)器內(nèi)部激發(fā)的事件處理函數(shù),它是基于一個(gè)服務(wù)器內(nèi)部的計(jì)時(shí)器的”,因?yàn)樵诩ぐl(fā)該事件時(shí)服務(wù)器上并沒(méi)有相關(guān)的HttpRequest對(duì)象,所以也不存在HttpContext這個(gè)概念。至于為什么客戶端需要通過(guò)再一次Request回發(fā)請(qǐng)求,才會(huì)得到0,根據(jù)上面的第一步來(lái)看也就很明白了。
總結(jié):
1)要激發(fā)Session_End(),必須正確配置Web.config,如<sessionState timeout="1" mode="InProc" />
2)Session_End()中是無(wú)法獲得HttpContext對(duì)象的。
3)執(zhí)行Session.Abandon()后,客戶端必須至少有一次請(qǐng)求,才能正確反應(yīng)Session的狀態(tài)。
因?yàn)檫@個(gè)方法只支持InProc(進(jìn)程內(nèi)的)類型的Session,所以我們將Web.config配置如下:
<sessionState?timeout="1"?mode="InProc">
</sessionState> 注:timeout的基本單位是:分
2.為什么執(zhí)行了Session.Abandon(),但是卻仍然可以從Session中取到值?
?? 為什么在Session_End()中,無(wú)法獲得HttpContext.Current對(duì)象?
按示例說(shuō)明:
aspx部分
????<form?id="form1"?runat="server">
????????<div>
????????????<asp:Literal?ID="lblMsg"?runat="server"></asp:Literal>
????????????<br?/>
????????????<asp:Button?ID="btnTest"?runat="server"?Text="注銷Session"?OnClick="btnTest_Click"?/>????????????
????????????<asp:Button?ID="Button1"?runat="server"?Text="回發(fā)"?/>
????????</div>
????</form>
aspx.cs部分
????protected?void?Page_Load(object?sender,?EventArgs?e)
????{
????????if?(!Page.IsPostBack)
????????{
????????????this.Session["state"]?=?1;
????????}
????????this.lblMsg.Text?=?Convert.ToInt32(Session["state"]).ToString();
????}
????protected?void?btnTest_Click(object?sender,?EventArgs?e)
????{
????????this.Session.Abandon();
????????//?重新設(shè)置lblMsg.Text
????????this.lblMsg.Text?=?Convert.ToInt32(Session["state"]).ToString();
????}
Global.ascx部分
????void?Session_End(object?sender,?EventArgs?e)?
????{
????????try
????????{
????????????HttpContext.Current.Response.Write("調(diào)用Session_End()方法");
????????}
????????catch
????????{
????????????throw?new?Exception("捕獲異常");
????????}
????}
運(yùn)行測(cè)試:
1)運(yùn)行程序發(fā)現(xiàn),點(diǎn)擊了“注銷Session”按鈕后,即使重新設(shè)置lblMsg.Text,輸出的值也仍然為1,并沒(méi)有像我們預(yù)期認(rèn)為的那樣,應(yīng)該是Session被注銷,然后通過(guò)Convert.ToInt32對(duì)NULL值的轉(zhuǎn)換后,輸出0。
2)現(xiàn)在給ASPX頁(yè)添加一個(gè)新的BUTTON控件,重新運(yùn)行程序,依次點(diǎn)擊“注銷Session” - “回發(fā)”,發(fā)現(xiàn)在第2次點(diǎn)擊后,結(jié)果輸出0。通過(guò)調(diào)試也發(fā)現(xiàn)在調(diào)用Session.Abandon()后,的確進(jìn)到了Session_End()方法。
注:通過(guò)調(diào)試發(fā)現(xiàn),第一步和第二步均可以激發(fā)Session_End()方法。
調(diào)試分析:
1)前置條件:點(diǎn)擊“注銷Session”按鈕
給btnTest_Click()內(nèi)的代碼設(shè)置斷點(diǎn),通過(guò)調(diào)試可以發(fā)現(xiàn),其中執(zhí)行的順序并
不是:從Session.Abandon() - 到Session_End() - 執(zhí)行完之后再返回到btnTest_Click()中繼續(xù)執(zhí)行其他事件
而是:將btnTest_Click()中所有事件執(zhí)行過(guò)后 - 再轉(zhuǎn)去執(zhí)行Session_End()
2)前置條件:無(wú)
在Session_End()中設(shè)置斷點(diǎn),然后正常啟動(dòng)頁(yè)面,因?yàn)槲覍essionState的timeout設(shè)置為1分鐘,所以干脆什么都不做,等1分鐘過(guò)去時(shí),發(fā)現(xiàn)程序自動(dòng)進(jìn)到Session_End(),執(zhí)行到這里思路應(yīng)該就比較清楚了,正如cnblogs很多貼子中所說(shuō)的“Session_End()是一個(gè)在服務(wù)器內(nèi)部激發(fā)的事件處理函數(shù),它是基于一個(gè)服務(wù)器內(nèi)部的計(jì)時(shí)器的”,因?yàn)樵诩ぐl(fā)該事件時(shí)服務(wù)器上并沒(méi)有相關(guān)的HttpRequest對(duì)象,所以也不存在HttpContext這個(gè)概念。至于為什么客戶端需要通過(guò)再一次Request回發(fā)請(qǐng)求,才會(huì)得到0,根據(jù)上面的第一步來(lái)看也就很明白了。
總結(jié):
1)要激發(fā)Session_End(),必須正確配置Web.config,如<sessionState timeout="1" mode="InProc" />
2)Session_End()中是無(wú)法獲得HttpContext對(duì)象的。
3)執(zhí)行Session.Abandon()后,客戶端必須至少有一次請(qǐng)求,才能正確反應(yīng)Session的狀態(tài)。
轉(zhuǎn)載于:https://www.cnblogs.com/cnxcfeng/archive/2008/05/09/1189171.html
總結(jié)
以上是生活随笔為你收集整理的关于Session_End()运行机制的一些细节!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 读过的好书[技术类]
- 下一篇: 一个很好的视频网站