询问者
asp.net真的是并行处理request的吗? 同一个session 的多个请求只能排队.

问题
-
asp.net真的是并行处理request的吗?
asp.net真的是并行处理request的吗? 同一个session 的多个请求只能排队.
我的项目里面多个页面需要使用session , 我发现。 asp.net 对同一个sessionID 的多次客户端请求只能排队等待。
比如: A.aspx 需要读写session , B.aspx 需要读写session .
A.aspx 页面需要一个比较长时间处理业务, B.aspx的请求只能是等待A.aspx完成之后才可以处理。
各位 大师。 怎么解决这个问题啊。
各位 大师。 怎么解决这个问题啊。
各位 大师。 怎么解决这个问题啊。
各位 大师。 怎么解决这个问题啊。
各位 大师。 怎么解决这个问题啊。
各位 大师。 怎么解决这个问题啊。
各位 大师。 怎么解决这个问题啊。
问题 : http://blog.csdn.net/shixin1198/article/details/6441711
全部回复
-
我补充一下,我说的是同一个session是同步访问的。不同session是异步的
我没有加入任何 同步机制,比如lock之类的。就新增一个页面A.aspx , B.aspx , 然后A.aspx写入一个简单数据到session里面,
然 睡眠 5分钟,。 超简单的页面。里面是有 2行代码. B.aspx访问 A.aspx那个session的值.
测试1:
在一个浏览器里面 先打开 A.aspx , 稍等几秒钟(确认A.aspx正在处理中) , 然后打开 B.aspx 页面, 你会发现 B.aspx 一直不会返回, 一直等到A.aspx处理完才返回。你自己试一试,测试2:将A.aspx与B.aspx分别用不同浏览器打开(如 A.aspx 用ie 打开, B.aspx 用Firefox打开 不会出现测试1的情况)
你自己试一试就知道。 我的经验告诉我微软限制了同一个session是同步访问的.
-
肯定是异步,session也是异步。session是根据cookie 或者 url中的sessionid 来确定,如果同步,就完蛋了。。。一个时间内置有一个用户访问是不可能的。
我猜想你代码是不是加入了同步机制,比如lock之类的。
所有回复都属原创,如有不清楚的回复请追问。
我补充一下,我说的是同一个session是同步访问的。不同session是异步的
我没有加入任何 同步机制,比如lock之类的。就新增一个页面A.aspx , B.aspx , 然后A.aspx写入一个简单数据到session里面,
然 睡眠 5分钟,。 超简单的页面。里面是有 2行代码. B.aspx访问 A.aspx那个session的值.
测试1:
在一个浏览器里面 先打开 A.aspx , 稍等几秒钟(确认A.aspx正在处理中) , 然后打开 B.aspx 页面, 你会发现 B.aspx 一直不会返回, 一直等到A.aspx处理完才返回。你自己试一试,测试2:将A.aspx与B.aspx分别用不同浏览器打开(如 A.aspx 用ie 打开, B.aspx 用Firefox打开 不会出现测试1的情况)
你自己试一试就知道。 我的经验告诉我微软限制了同一个session是同步访问的.
-
您好,
的確如此哦!
不過,一個user登入會使用他的session,實務上蠻少會不同的page去assign同一個session的值!
-
是并行处理。
读写同一个 Session ,相当于访问共享资源,是要加锁的,所以给你感觉就是在排队。
根据上面 楼主的描述 测试 的确是 需要等待 A.aspx 处理完(5分钟过后 ) B.aspx 才能够 进入 Page_load 事件处理。
其实 B.aspx 的请求已经发送到服务器, 就是卡在哪里,等待 A.aspx .
并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。
并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。
并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。
我的测试结果就是这样的。
- 已编辑 小小恋 2013年8月15日 10:28 ffff
-
这个只影响一个浏览器端,不会影响其他浏览器端。 但是 微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。 不知道到微软为什么这样实现。
锁 在了整个页面的生命周期内
你可以用两个页面的交替使用同一个 session 来共享一个值的方式来分析为什么在写此 session 时,需要在在整个页面周期锁定,另外,请记住,页面只有一次输出,不会输出完后,再 seek 到开头部分去修改。
比如:A 页面和 B 页面,
A:往 session 中写入字符 "A"
B: 从 session 读出字符 "A" ,并显示到页面上。
我们想要的正确结果是,如果 A 页面先请求,那么 B 页面就一定要显示出字符 "A"——这个设定,我们能达成一致不?
按照你的要求,只是在 A 页面写入字符 "A" 时才锁定,写完成后立即释放,那么请考虑这样一种情况:
1、A 页面在 T1 时被请求,B 页面在 T2 时被请求;( T1 < T2 )
2、T3 时刻,B 页面获取读锁,读取字符,释放读锁,那么 B 页面肯定无法显示出字符 "A",因为 A 页面还没写入;
3、T4 时刻,A 页面获取写锁,写入字符 "A",释放写锁;
我相信你也看出问题了,问题的根本就在于,没有同步机制时,A 页面先请求,并不代表 A 页面中的所有方法一定先于 B 页面执行。
-
小小恋:你好,本人知道你深深地被这个基础性的概念问题所困惑。
所以特意在此给你详细解释ASP.NET中是不是并行处理Session的问题。
在讨论这个问题之前,我做了一个简单的示例项目作为参考的依据。
//A.aspx.cs namespace WebApplication1 { public partial class A : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Session["S"] = 1; //A页面做写入Session的操作 System.Threading.Thread.Sleep(10000); //休眠10秒 } } } //B.aspx.cs namespace WebApplication1 { public partial class B : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Session["s"] != null) { var s = Session["S"]; Response.Write(s); //如果Session有值,则输出到B页面上 } else { Response.Write("Session[\"S\"]为空!"); //Session没有值就输出Session为空的提示。 } } } }
此时如果你用同一个浏览器按顺序先打开A.aspx然后在打开B.aspx的话,你会看到B.aspx会先等待A.aspx休眠10秒后才加载出来。因为B和A用的都是用一个会话(Session),也就是说他们的SessionId是相同的。
浏览器中标签页A的Cookie:ASP.NET_SessionId=bv0rzkhoedchv0diujtwkiwv,标签页B的Cookie:ASP.NET_SessionId=bv0rzkhoedchv0diujtwkiwv。所以B页面必须得等A页面解除锁定Session后才能够访问A页面上的Session信息。但是如果你用ie打开A.aspx然后在用火狐浏览器(或者其他浏览器)打开B.aspx的话就不会出现这个问题因为B和A的Session都是独立区分的。
PS:如果你的电脑上只安装了1个浏览器的话你可以更改你的web.config为如下配置:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <sessionState cookieless="UseUri"></sessionState><!-- 将此行代码应用到你的web.confg上 --> </system.web> </configuration>
然后你在重试一下看看效果。
Q:ASP.NET为什么要把Session锁在页面生命周期上的问题
A:如果不是锁在页面生命周期上,多个页面同时对Session互操作时会发生线程不安全的问题,在技术调试上也给技术人员带来极大的调试难题。如有问题请继续回复,大家会及时为你解答接触你对ASP.NET的困惑。如果回复对你有帮助请及时标记答案。
致谢。
博客园: dotNetDR_ 的博客 - 天杀下来的BUG,不怕有我来挡!
博客园介绍: 博客园创立于2004年1月,是面向软件开发者的高品质IT技术社区,聚集了很多优秀的软件开发者和IT技术学习者。- 已编辑 dotNetDR_ 2013年10月10日 10:40 改