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

  • 问题

  • 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


    • 已编辑 小小恋 2013年1月10日 0:42 完善
    • 已更改类型 小小恋 2013年1月18日 8:16 改为问题
    2013年1月9日 5:18

全部回复

  • 肯定是异步,session也是异步。session是根据cookie 或者 url中的sessionid 来确定,如果同步,就完蛋了。。。一个时间内置有一个用户访问是不可能的。

    我猜想你代码是不是加入了同步机制,比如lock之类的。


    所有回复都属原创,如有不清楚的回复请追问。

    2013年3月21日 16:32
    版主
  • 我补充一下,我说的是同一个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是同步访问的.

    2013年8月14日 2:44
  • 肯定是异步,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是同步访问的.

    2013年8月14日 2:46
  • 您好,

    的確如此哦!

    不過,一個user登入會使用他的session,實務上蠻少會不同的page去assign同一個session的值!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年8月14日 3:09
  • 是并行处理。

    读写同一个 Session ,相当于访问共享资源,是要加锁的,所以给你感觉就是在排队。

    2013年8月14日 3:25
  • 根据上面 楼主的描述  测试 的确是 需要等待 A.aspx 处理完(5分钟过后 )  B.aspx 才能够 进入 Page_load 事件处理。

    其实 B.aspx 的请求已经发送到服务器, 就是卡在哪里,等待 A.aspx .

     并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。

    我的测试结果就是这样的。


    • 已编辑 小小恋 2013年8月15日 10:29 dddd
    2013年8月15日 10:23
  • 是并行处理。

    读写同一个 Session ,相当于访问共享资源,是要加锁的,所以给你感觉就是在排队。


    根据上面 楼主的描述  测试 的确是 需要等待 A.aspx 处理完(5分钟过后 )  B.aspx 才能够 进入 Page_load 事件处理。

    其实 B.aspx 的请求已经发送到服务器, 就是卡在哪里,等待 A.aspx .

     并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。

     并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。

     并且微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。

    我的测试结果就是这样的。



    • 已编辑 小小恋 2013年8月15日 10:28 ffff
    2013年8月15日 10:23
  • 这个只影响一个浏览器端,不会影响其他浏览器端。 但是 微软的实现是 把 某个session 的锁 在了整个页面的生命周期内, 而不是写入时锁住,写完释放。 不知道到微软为什么这样实现。

      锁 在了整个页面的生命周期内


    • 已编辑 小小恋 2013年8月15日 10:28 gg
    2013年8月15日 10:27
  • 这个只影响一个浏览器端,不会影响其他浏览器端。 但是 微软的实现是 把 某个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 页面执行。

     

    2013年8月20日 1:54
  • 应该是针对单个浏览器的.

    Please mark this as answer if it helps with this issue!

    2013年9月10日 16:20
  • 小小恋:你好,本人知道你深深地被这个基础性的概念问题所困惑。

    所以特意在此给你详细解释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
    2013年10月10日 10:32