如何得到iis中某个应用的所有用户的Session对象?不只是得到当前会话Session,而是要得到所有在线用户的Session

解决方案 »

  1.   

    Session:
    public sealed class HttpSessionState : ICollection, IEnumerable
    注意:IEnumerable
    所以可以:
    Session["test"]="haha";
    Session["test1"]="aah";
    IEnumerator enumerator = Session.GetEnumerator();
    while(enumerator.MoveNext())
    {
    Response.Write("Session Value:"+enumerator.Current.ToString()+"<br/>");
    }
      

  2.   

    输出结果:
    Session Value:test
    Session Value:test1
    所以改成这样
    Session["test"]="haha";
    Session["test1"]="aah";
    IEnumerator enumerator = Session.GetEnumerator();
    while(enumerator.MoveNext())
    {
    Response.Write("Session Value:"+Session[enumerator.Current.ToString()].ToString()+"<br/>");
    }
    输出结果就是
    Session Value:haha
    Session Value:aah
      

  3.   

    .NET 2.0的FCL有个SessionStateStoreData类,用于存储所有用户的session
    而SessionStateModule有一个private变量,private SessionStateStoreData _rqItem;所以你用反射机制把这个_rqItem弄出来,再访问SessionStateStoreData.Items属性应该就可以了FCL没有公开这些东西
      

  4.   

    greennetboy的方法,只能得到当前用户的所有session变量
      

  5.   

    for(int i = 0;i<Session.Count;i++)
    {
    Response.Write(Session.Keys[i] + " : " + Session[i]);
    }
      

  6.   

    测试了一下,的确只能取出当前用户得Session
    那么所有得Session变量怎么获得亚?
      

  7.   

    我觉得可能不行,因为,所有用户都是平等的,没有哪个用户可以操纵其他用户的Session,如果允许这样,可能存在安全问题。
      

  8.   

    因为.net程序是以虚拟目录作为应用程序之间的间隔。
    根本无法取得整个站点的的session,
    也就是如果你有一个a虚拟应用程序,想调用b虚拟应用程序的session,这个是不可能得道的。
    除非它们属于一个虚拟应用程序。
      

  9.   

    我这里说的是.net 1.1,20的情况我不是很清楚。
      

  10.   

    从ASP.NET Web Application的实现原理来说,是不可能从Session A去读取Session B的数据的,举个例子来说,HttpApplication在同一时刻只能处理一个Request,而SessionState数据是在请求链路上被抓取/写回的,在一个请求结束之后,无法确定任何SessionState相关的东西(比如你用SQLServer Session Mode,数据在请求实际被处理之前和处理完成后根本不存在于服务器内存中),因此说跨越HttpContext去读取WebApplication全部现存SessionState的数据是不可以的。
    但是世事无绝对,你可以开发一个HttpModule,通过在ASP.NET运行时管道中插入自己的处理模块来截获SessionState的恢复/存储,至少可以做到了解所有Session数据的最后状态。如果你使用了SQLServer session mode,你甚至可以直接去读取存储在session表里面的数据……只要你能解码,不过我看是不可能了,呵呵
      

  11.   

    回复人: kingastar(qingzhu) ( ) 
    即使对于同一个Web Application,也无法简单的直接读取全部其他Session的state。原理见上面的论述。你需要通过HttpModule来截获Session数据的处理请求,才能抓去全部的SessionState
      

  12.   

    另外,如果严格按照楼主的描述“得到iis中某个应用的所有用户的Session对象”,那就更难说了,IIS可以host不同类型的web application,除了ASP.NET,还有ASP,以及一些第3方的web application (比如Intraweb),它们的Session机制各不相同,要全部抓取,方法也就各不相同
      

  13.   

    可以这样做吗?与其重写session,不如用数据库或XML做中间存储媒体不是更简单?
      

  14.   

    回复人: isline(缘清) ( ) 信誉:100  2005-12-16 14:26:00  得分: 0  
     
     
       可以这样做吗?与其重写session,不如用数据库或XML做中间存储媒体不是更简单?
      
     
    ===ASP.NET提供定制机能,可以通过重新设置SessionMode,或者开发新的HttpModule,实现对Session数据的透明处理,例如可以在用户读写Session的时候将读写动作重定向到数据库(如同SQLServer模式)或者xml(要自己写代码)。利用架构的内置能力来处理,要比在代码中反复调用读写数据库或者xml方便和容易维护的多