关于Session_End()运行机制的一些细节!

1.首先是如何激发Session_End()方法
因为这个方法 只支持InProc(进程内的)类型的Session,所以我们将Web.config配置如下:
< sessionState timeout = " 1 "  mode = " InProc " >
</ sessionState >
注:timeout的基本单位是:分

2.为什么执行了Session.Abandon(),但是却仍然可以从Session中取到值?
   为什么在Session_End()中,无法获得HttpContext.Current对象?
按示例说明:
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 = " 回发 "   />
        
</ 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();
        
// 重新设置lblMsg.Text
        this.lblMsg.Text = Convert.ToInt32(Session["state"]).ToString();
    }

Global.ascx部分
     void  Session_End( object  sender, EventArgs e) 
    
{
        
try
        
{
            HttpContext.Current.Response.Write(
"调用Session_End()方法");
        }

        
catch
        
{
            
throw new Exception("捕获异常");
        }

    }

运行测试:
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,如 <sessionState timeout="1" mode="InProc" />
2) Session_End()中是无法获得HttpContext对象的。
3)执行Session.Abandon()后,客户端必须至少有一次请求,才能正确反应Session的状态。

转载于:https://www.cnblogs.com/Fernando/archive/2008/08/01/1258420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值