none
自定义Session架构 RRS feed

  • 问题

  • 常有人说B/S结构注定无法实现C/S结构那样的管理在线用户功能.

    本人不巧,研究了4,5天FrameWork框架的Session架构.

    目前已实现了能实时的管理在线用户.即显示当前所有访问Web的用户(有Session对象的客户端,只能是有Session对象的,因为基于Session).

    并且能实时的踢出(删除)指定用户的Session对象(即让指定的已登录Web的用户,登录凭据失效)

     

    为此:我重写了SessionModule.

    自定义了Session提供程序(状态管理提供程序)

    并且自定义了Session对象(实现IHttpSessionState接口)

     

     

    并且能像Inpro模式时那样,指定时间到了就自动引发Session_End事件.

     

     

    目前有个不完美的地方请教各位讨论讨论.

     

     

    Session是SessionState类

    我可实现ISessionState接口,取代SessionState类.

     

    我可自定义实现状态管理提供程序.

    自定义这个你就可以确定用什么方式来存储所有的Session对象.

     

    好比我就是使用的HashTable来做的.

     

    最后通过自定义Session的HttpModule处理,来实现Session对象的建立流程.

     

    流程大概:Module->Session管理类->Session对象

     

    目前在Module这个环节有这么几个问题.

     

    Module被执行了,不是自己写代码new了个对象,然后调用函数来执行的. 而是IIS或FrameWork内核或其他来自动New,然后自动调用指定函数或接口的.

    因为A用户,B用户,C用户的Session对象是通过Session管理类来管理的. 而Session管理类是在Module里调用的.最重要的是A,B,C...用户的Session对象是放在HashTable表,而HashTable对象是在Module里定义的.

     

    任何一个用户访问会自动执行Module.会自动创建一个Module里面的HashTable对象 (该对象非Static).

     

    按照常理,不同用户会有不同的Module对象,也就会有不同HashTable对象.

    但实际情况我发现.

    貌似FrameWork框架只会建立Module对象一次.

     

    然后不管任何用户访问Web,都是使用这个已经建立的Module对象.

     

    这也就是为什么HashTable对象不是Static的,但A用户第二次访问你重新取回自己的Session对象,B用户也是.

     

    1.什么对象调用的HttpModule类? 这个对象肯定创建了HttpModule类的对象.因为自定义的HttpModule类不是Static的,代码要被执行必须被New,有了对象后才能执行写的代码.

    关键:如何引用这个类? 或者引用自动New了的HttpModule类的对象?

     

    2:虽然我自己实现了Session对象类.但FrameWork会把我自定义的Session类所创建的Session对象附加到当前Web用户的HttpContent里.

    而HttpContent里是根据IHttpSessionState接口来做,因为FrameWork自带的Session类和我自定义的Session对象类都是继承的这个接口,所以我自定义的Session对象可以附加过去.

    但是,我自定义的Session对象里除了接口定义,还附加了其他的.其他的就全丢了=.=

     

    我需要重写HttpContent类? =.=  这个类继承接口=.=

    说白了,就是如何改变Page.Session这个属性所对应的类. 我要改FrameWork框架,改Session架构.

    实现Page.Session这个属性里面出现我自定义的,张三属性,李四函数.

     

     

    另附达人指条明路: 自己写整个Session体系,从HttpRequest请求开始=.=

     

     

    2010年5月13日 9:38

答案

全部回复

  • 参考下这个试试

    http://msdn.microsoft.com/zh-cn/library/aa479313.aspx


    【孟子E章】
    2010年5月14日 3:33
    版主
  • 谢谢.

    我详细参考了下.逻辑和我想的一样.

    不过MSDN给得比较简单.

    对于过期时间的更新问题没有做很好的处理.

     

    不过这也给了我很多启发了.

    对于序列化和反序列化方面,还有重写Page的Session类等等.

     

    目前还是打算,自写一套简略的Session框架.

    自己做Cookie处理,自己做过期处理,通过Module来做吧.

     

    然后全局禁止使用Session.

     

    不想要安全.

    只是想要对全局Session元数据的绝对控制权限,没想到哎.

    最后居然逼得我下决心动这么大的功夫.

    也让我对于FrameWork的Web体系了解了不少.

    呵呵.

     

    如果孟先生有对于内存存储模式有什么方式能高效且安全的处理高并发量时的Session对象处理请说说.

    2010年6月9日 8:39
  • 汗.那个示例下载代码下来看.

    它的SessionID居然....Guid.NewGuid().ToString();

    这样生成的=.=

    ╮(╯▽╰)╭.

    2010年6月9日 8:45