日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(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)。

轉(zhuǎn)載于:https://www.cnblogs.com/cnxcfeng/archive/2008/05/09/1189171.html

總結(jié)

以上是生活随笔為你收集整理的关于Session_End()运行机制的一些细节!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。