asp.net中Session锁机制,第一次请求无效的问题

问题描述

第一次在CSDN上提问,请大牛们多关照啊背景描述:asp.net中,同一个会话(相同的SessionID)的不同请求,会由于Session锁机制产生阻塞问题,即如果两个请求都要修改Session的值,那么后到的请求要等前面的请求结束(锁释放)后才能访问到Session。但今天我发现了一个问题,首先贴测试代码:publicActionResultAbout(){Session["test"]="AboutMsg";ViewBag.Message=Session["test"].ToString()+"-"+Session.SessionID;returnView();}publicActionResultContact(){Session["test"]="ContactMsg";longj=0;for(longi=0;i<=1000000000;i++){j=i/100000*(i-1);}ViewBag.Message=Session["test"].ToString()+"-"+Session.SessionID;returnView();}

运行后在浏览器访问“Contact()”(设此次访问为A1),由于循环,此次请求需要执行十多秒。等待几秒后访问“About()”(设此次访问为B1),“About()”没有被阻塞,而是很快刷了出来,且页面上显示的是“AboutMsg”+SessionID。等待一会儿,Contact()中的循环结束,Contact()页面刷了出来,页面上显示“ContactMsg”+SessionID两个页面中显示的SessionID是完全一样的,如图所示,红框部分是输出的结果由此可见:A1的执行并没有阻塞B1,且此时它们是操作了同一个会话(SessionID相同),但A1中的Session["test"]的值却没有被B1影响。之后,再次访问“Contact()”(设此次访问为A2),“About()”(设此次访问为B2)。此时“About()”没有立即刷出来,而是等待十多秒后,“Contact()”“About()”同时刷了出来。问:1、B1为什么没被A1阻塞。2、为什么再次请求,B2就会被A2阻塞了。3、B1应该在A1的Session["test"]="ContactMsg";语句后开始执行,且执行完成,为什么A1的Session["test"]没有被改变。

解决方案

解决方案二:
A1的执行并没有阻塞B1,且此时它们是操作了同一个会话(SessionID相同)你这个测试场景本身有问题,你应该A1访问X秒钟才能得到结果,B1访问Y秒钟才能得到结果,然后两个请求一起发起,这时候你在F12里面就能看到某一个的请求一定是大于等于X+Y上次有个帖子也是说这个阻塞问题的,但一时间找不到
解决方案三:
引用1楼starfd的回复:

A1的执行并没有阻塞B1,且此时它们是操作了同一个会话(SessionID相同)你这个测试场景本身有问题,你应该A1访问X秒钟才能得到结果,B1访问Y秒钟才能得到结果,然后两个请求一起发起,这时候你在F12里面就能看到某一个的请求一定是大于等于X+Y上次有个帖子也是说这个阻塞问题的,但一时间找不到

呃,我已经尝试过很多次了。我的测试场景是:A1发起后,等待几秒后才发起B1(此时A1应该是在运行循环)。但结果都是:运行程序后的第一次操作,A1不会阻塞B1。紧接着再进行A2B2,A3B3,A4B4....等等操作,B操作都是会被阻塞的。如果测试场景有问题,我实在找不出问题在哪,还望告之。

时间: 2024-12-28 16:44:55

asp.net中Session锁机制,第一次请求无效的问题的相关文章

详解ASP.NET中Session的用法_实用技巧

      当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终止该会话.        通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象.当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有

ASP.NET中Session的状态保持方式浅议

asp.net|session ASP.NET提供了Session对象,从而允许程序员识别.存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息.Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件.程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等. 在ASP.NET的程序中

浅议ASP.NET中Session的状态保持方式

asp.net|session ASP.net提供了Session对象,从而允许程序员识别.存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息.Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件.程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等. 在ASP.NET的程序中

ASP.NET中Session的状态保持方式

asp.net|session ASP.NET提供了Session对象,从而允许程序员识别.存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息.Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件:在对话超时或者被关闭的时候会触发Session_onEnd 事件.程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等.    在ASP.NET的

ASP.NET中Session状态保持方式浅议

ASP.net提供了Session对象,从而允许程序员识别.存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息.Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件.程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等. 在ASP.NET的程序中要使用Session对象时,必须

ASP.NET中Session和Cache的区别总结

  这篇文章主要介绍了ASP.NET中Session和Cache的区别总结,本文结合使用经验,总结出了5点Session缓存和Cache缓存的区别,需要的朋友可以参考下 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application.其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息.Session则保存对话信息.Application则是保存在整个应用程序范围内的信息,相当于全局变量.通常使用最频繁的是Session,那么Sess

游戏设计中的锁机制

这篇文章是关于游戏设计中一个普通细节的,我把它称为"锁"机制.尽管"锁"这种概念在很多类型的游戏中都会出现,但是它对于冒险游戏和角色扮演游戏(RPG)来说有着非同小可的作用. 游戏设计师为了做出高品质的RPG或冒险游戏,往往需要做大量的工作.必须架构一个完整的世界.如果一个玩家可以操作他的角色不受限制的穿越整个世界,那么他必然会错过很多精心设计的地区. 为了避免这个问题,设计师在游戏中加入了"锁"的概念.这就保证了玩家在探索完足够的区域后才能进入

asp.net中session参数问题

问题描述 asp.net中session参数问题 修改密码网页的load代码如下: if(Session["userName"]==null) { Response.Write("已经超时!");Response.End(); } pswModify1.tableName = "管理员"; pswModify1.userName = Session["userName"].ToString(); Session.Remove(

ASP.NET 中 Session 实现原理浅析 [2] 状态管理器

asp.net|session 状态管理本来是一件很美好的事情,嘿嘿,只可惜总是有些厂商在实现的时候考虑得不那么周全.例如 MS 在 ASP 中的状态管理实现就比较烂,因为只实现了一个进程内的基于内存的状态管理,故而存在很多问题: 1.所有的 Session 数据都保存在 Web 服务的进程中,会造成服务器支持会话数量受到服务器内存资源的限制问题,同时也因为大量非活动会话导致内存被无效占用. 2.服务器进程崩溃会导致所有的会话数据丢失. 3.会话无法跨进程或在负载均衡情况下使用,除非负载均衡技术