C#积累(二)——ASP.NET的Session会加锁

项目:ASP.NET 网站程序

版本:.net 3.5

运行IDE:VS 2008 SP1

项目文件:Default.aspx

 

通过设置页面上的EnableSessionState可以为Session加锁:

EnableSessionState="True":页面对Session设置读写锁。有这个SessionID的Session在每个请求过程中会被锁定.

EnableSessionState="False":页面不需要访问Session。如果代码使用Session对象,就会抛出HttpException异常.

EnableSessionState="ReadOnly":页面对Session设置读取锁.读取锁和读锁之间不互斥,但是和读写锁互斥.

 

一个现象:

页面设置EnableSessionState="True"的时候Session会给每个请求加上读写锁,言下之意就是一旦一个请求访问了申请并在请求没有结束的时候会一直占有Session,其余请求访问Session的时候必须等待占有Session的请求结束。

但是经过我实验发现这个定义对第一次请求似乎不起作用,请看Default.aspx.cs:

ExpandedBlockStart.gif 代码
protected   void  Page_Load( object  sender, EventArgs e)
{
    
if  (Request.QueryString[ " test " ==   null )
    {
        Session[
" test " =   " 23 " ;
        Session[
" test " =  persist();
        
// Session["test"] = "over";
    }
    
else
    {
        Session[
" test " =   " over " ;
    }

    Response.Write(Session[
" test " ].ToString());
}

string  persist()
{
    System.Threading.Thread.Sleep(
6553500 );
    
return   " over " ;
}

 

 

首先在浏览器输入:http://localhost/SessionExcise/Default.aspx由于Sleep会一直执行
在IE上Ctrl+T(保证和刚才是同一个Session)输入:http://localhost/SessionExcise/Default.aspx?test=2按道理来说会被阻塞,因为Session被刚才的请求加了读写锁被占有。但是结果没有被阻塞,执行成功浏览器上显示over。


现在改变执行顺序先执行http://localhost/SessionExcise/Default.aspx?test=2,不用说执行成功
再Ctrl+T输入http://localhost/SessionExcise/Default.aspx因为Sleep被阻塞
再Ctrl+T输入http://localhost/SessionExcise/Default.aspx?test=2结果这次符合了定义被阻塞了

为什么第一次输入http://localhost/SessionExcise/Default.aspx?test=2没有被阻塞呢?

原因就在SessionID上,第一次先输入http://localhost/SessionExcise/Default.aspx由于请求没有发送SessionID服务器认为是新会话会在响应中给浏览器分配SessionID,又由于Sleep的缘故,响应中分配的SessionID并不会返回给浏览器,由于浏览器没有分配到SessionID,Crtl+T后输入http://localhost/SessionExcise/Default.aspx?test=2请求仍然没有发送SessionID给服务器,所以服务器认为原先的http://localhost/SessionExcise/Default.aspx请求和现在的http://localhost/SessionExcise/Default.aspx?test=2都是新会话,都会为这两个请求单独分配SessionID,由于服务器认为两次请求是不同的会话所以自然不会产生会话阻塞

 

但是第二个执行顺序由于第一输入http://localhost/SessionExcise/Default.aspx?test=2响应返回后浏览器分配到了SessionID,之后再用Ctrl+T发出的请求都会沿用这个SessionID,所以接下来在http://localhost/SessionExcise/Default.aspx后再输入http://localhost/SessionExcise/Default.aspx?test=2被服务器判定为同一会话,会话中的读写锁就会起作用了造成阻塞,这点值得注意!

转载于:https://www.cnblogs.com/OpenCoder/archive/2010/01/10/1643659.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值