当前位置: 代码迷 >> C# >> Session的疑义
  详细解决方案

Session的疑义

热度:118   发布时间:2016-05-05 04:21:19.0
Session的疑问
我在index.html前台页面写了如下语句:
<img  src="Default.aspx?a=1"/>
<img  src="Default.aspx?a=2"/>
<img  src="Default.aspx?a=3"/>
<img  src="Default.aspx?a=4"/>
<img  src="Default.aspx?a=5"/>

在Default.aspx的PageLoad事件如下:
 protected void Page_Load(object sender, EventArgs e)
    {
        switch (Request.QueryString["a"].ToString())
        {
            case "1": Session["a"] = 1; break;
            case "2": Session["b"] = 1; break;
            case "3": Session["c"] = 1; break;
            case "4": Session["d"] = 1; break;
            case "5": Session["e"] = 1; break;
            default:
                break;
        }

    }


在PageLoad事件结束的大括号处加断点 ,
执行index.html,在断点处查询Session,发现每一次之前的Session都被之后的页面覆盖了,
但是F5刷新页面之后,再查看断点处的Session则可以保留,求解!!!
------解决思路----------------------
数据有的,不过赋值的顺序不一定跟你的html顺序一致
------解决思路----------------------
被覆盖的意思是 被清空?
------解决思路----------------------
我反复测试了下,这个完全没规律……
一会有,一会没有,最多的一次三个session赋值成功了,最少的就最后一个成功了……
改成Handler也是这样
------解决思路----------------------
session锁不应该导致数据丢失啊……
------解决思路----------------------
页面的Session集合,并不是网站的Session集合。当你的页面请求处理(单独一个线程中运行)时,asp.net从系统的Session集合中将与当前请求的SessionID相关联的Session单元拷贝到页面Session中。当页面处理完毕,asp.net会把你的修改拷贝回系统的Session集合中。

如果要理解asp.net(而不是简单地抄入门书上的代码),找两三本有点深度的asp.net组件开发机制的书看看,其中就会有对asp.net稍深入一点的讲解。
------解决思路----------------------
这个可以认为是同一个用户对同一个地址发起了N个请求,这个地址是要写Sesson的,请求是都已经发到后端服务器了,然后服务器因为Session锁在那里排队等待执行
最诡异的是我好几次执行出倒数第三次赋值,在第四次没了,结果第五次时第三次赋的session又有值而第四次的却没值了的情况
------解决思路----------------------
数据应该不是不丢失,而是已经写入session,只是没能读到而已
------解决思路----------------------
引用:
页面的Session集合,并不是网站的Session集合。当你的页面请求处理(单独一个线程中运行)时,asp.net从系统的Session集合中将与当前请求的SessionID相关联的Session单元拷贝到页面Session中。当页面处理完毕,asp.net会把你的修改拷贝回系统的Session集合中。

如果要理解asp.net(而不是简单地抄入门书上的代码),找两三本有点深度的asp.net组件开发机制的书看看,其中就会有对asp.net稍深入一点的讲解。

虽然你这么解释,但我还是不能搞懂,因为在可修改时,同一个用户的请求会被阻塞,既然有阻塞,那就说明肯定在进入lock区域后,会将session单元copy出来,那为什么还会出这种情况呢,难道session写回集合是异步的,但貌似也说不通,因为我一个debug等待了起码5秒钟,但第一次的session在第三次,第四次甚至第五次都没有被获取到
  相关解决方案