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/cnxcfeng/archive/2008/05/09/1189171.html

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

  1. 傻傻分不清的javascript运行机制

    学习到javascript的运行机制时,有几个概念经常出现在各种文章中且容易混淆.Execution Context(执行环境或执行上下文),Context Stack (执行栈),Variable ...

  2. 从hello world 说程序运行机制

    http://www.cnblogs.com/yanlingyin/archive/2012/03/05/2379199.html 开篇 学习任何一门编程语言,都会从hello world 开始.对于 ...

  3. js 多个定时器_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(二)

    作者:撒网要见鱼   https://segmentfault.com/a/1190000012925872 本文接上篇 <从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(一)> ...

  4. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  5. 以太坊完整工作原理和运行机制!

    以太坊完整工作原理和运行机制! 2018年04月28日 00:00:00 阅读数:26 作者 | Preethi Kasireddy 编译 | 老曹.Aholiab 链圈的人提起「以太坊」三个字想必是 ...

  6. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

    最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...

  7. 【Spark 深入学习 04】再说Spark底层运行机制

    本节内容 · spark底层执行机制 · 细说RDD构建过程 · Job Stage的划分算法 · Task最佳计算位置算法 一.spark底层执行机制 对于Spark底层的运行原理,找到了一副很好的 ...

  8. 天龙源码框架分析_MySQL8-InnoDB总体架构和运行机制的系统分析(上)

    1. 前文回顾:四个阶段和两种方法 首先让我们回顾下,在上一篇文章介绍的MySQL8代码分析的四个阶段和两种方法. 四个阶段: 借鉴瀑布式软件开发流程,我们将从熟悉MySQL的使用和运维,到吃透MyS ...

  9. javascript等待异步线程完成_作为前端你了解JavaScript运行机制吗?

    作为前端工程师,大家都知道js是前端一开始就要学会的知识点,js的代码你会写了,那js的运行机制你了解吗?只有了解了js的运行机制,才能在工作中如鱼得水,今天就跟随珠峰的老师一起来了解下js的运行机制 ...

最新文章

  1. CV算法复现(分类算法3/6):VGG(2014年 牛津大学)
  2. 数学仍然是人类的“火炬”
  3. 多平台下的32位和64位Oracle10g下载
  4. pandas按条件过滤_pandas条件组合筛选和按范围筛选的示例代码
  5. 在服务器上处理gis文件,云服务器处理gis
  6. 新增房源服务实现之新增房源RESTful接口的开发
  7. bootstrap 打印组件_如何在Bootstrap项目中用Vue.js替代jQuery
  8. 战斗民族的Yandex开始首次雪地无人车路测 | 视频
  9. 激活Maven profile的几种方式
  10. iOS汉字转拼音,日韩文字转拼音
  11. C++类的成员函数(在类外定义成员函数、inline成员函数)
  12. 芒果DB:mongodb
  13. java判断日文_如何在Java字符串中检测日文文本?
  14. 我的世界服务器如何开无限小号,实操神技能,微信能“无限”开小号?
  15. SVM + HOG实现图像分类
  16. web小白,实战操作拿到网站后台账户和密码
  17. 【信息系统项目管理师】项目管理过程的三万字大论文
  18. c# 容联云_Rest Server Demo_开发文档_容联云通讯
  19. oracle查询员工表领导级别,emp表中怎么统计每个员工的领导的年薪,并按年薪由高到低排列...
  20. 命令行 修复系统_让我们修复旧的命令行

热门文章

  1. php 网页内容下载,php实现当前页面点击下载文件的简单方法
  2. CentOS开机自动运行程序的脚本
  3. mysql安装提示create_MySQL5.1安装时出现Cannot create windows service for mysql.error:0
  4. vue路由切换组件没有加载_vue-router 路由跳转后没有加载组件
  5. python 获取方法名_python 动态获取当前运行的类名和函数名的方法
  6. IT兄弟连 JavaWeb教程 MVC设计模式
  7. RocketMQ架构模块解析
  8. PHP双引号的小隐患
  9. 如何去掉CodeIgniter URL中的index.php
  10. 利用libswscale转换yuyv422到yuv422p或rgb之间的转换, 视频翻转