日期:2014-05-18  浏览次数:20441 次

关于ASP.net中的会话状态问题,有请高人。
1、问题来源
        在保存会话状态和不同页面间交换的数据时,我们没有用Sesstion、Application等对像,而是自己另外写了一个与Sesstion工作类似的“列表类”,里面每一个项目用一个Key去访问它,每一个项目是一个Object,这样,我们的“列表类”中就可以保存任何的数据类型。

        当然,“列表类”中的KEY要求必须要是唯一的,所以,我们就采用了Session   ID来作为“列表类”的Key。

        我们在UI端,采用了“模板视图”的模式,通在生成了Page类的子类,来定义每一个页面中大部分重复的动作,比如,在装入页面以后,要判断用户使用软件的许可、使用模块的权限,所以,我们在实现“模板视图”时,便先取得当前的Sesstion   ID,再去查找服务器进程中的那个“列表类”,就得到当前会话的所有状态信息;

2、问题产生
      上述做法,产生了如下两个问题:
      A、经常会出现用户登录以后断线的情况,经测试,发现是因为在打用新的IE窗口时,IIS产生了一个新的Session   ID;

      B、在列表类中保存的对像(比如向导界面中不同的页面之间的数据、Dataset对象实例、DataTable实例等),在何时释放?Sesstion   End事件中,好像是不可能的;

===============
问题如上所述,有请高人指点。


------解决方案--------------------
建议使用state server或sql server保存session,这样不容易丢失
------解决方案--------------------
不要用SESSIONID作KEY,使用用户名和IP自己根据实际需求写个算法生成一个KEY

这样在用户打开新IE时,通过用户名和IP可知是同一用户,如果允许多登录,则用户名+多IP,否则,第二次换IP登录时,禁止登录,不过,你要有合适的方法来踢除下线用户
------解决方案--------------------
A:
会话SessionID本来就是如此,打开新窗口的时候浏览器就是作为新的会话,跟iis都没有关系。如果你要让不同的会话也被登记为相同的 ID,你应该自己设计别的东西,例如使用cookie保存身份id值。当然,使用cookie保存的id在逻辑上就跟sessionID根本不是同一个作用域范围。

在“不同页面间交换的数据时”不应该使用会话状态来保存数据,特别是这个Key不应该随便起。

B:
使用 Session_End 也可以,你自己定时(例如记录会话最后一次访问的时间判断超时)去清理也可以。
------解决方案--------------------
会话就是真正的会话,按照它的功能需求,它不能依赖于登录的用户名这个概念来设计。
------解决方案--------------------
很不明白你为什么要自己写一个?这么关键的KEY不要用session,cookie,application
------解决方案--------------------
A
对于 第一个
最好的 替换 就是 使用 cookies 来保存 登录信息.

B
你的数据 应该是登录用户 使用时候读取 输出给页面 后就释放掉和
这个东西 和Session_End没联系.


------解决方案--------------------
mark
------解决方案--------------------
比如说根据IP或其他之类的东西生成能唯一表示该客户的ID。
——————————————————————————————————————————
同时在线的不同客户端的IP完全可以相同。至于“或其他之类的东西”又是指什么呢?

前边已经说了这个东西可以是什么,只是你不愿意看中而已。
------解决方案--------------------
怎么没有人呢,帮顶了~~~
------解决方案--------------------
A、经常会出现用户登录以后断线的情况,经测试,发现是因为在打用新的IE窗口时,IIS产生了一个新的Session ID;

B、在列表类中保存的对像(比如向导界面中不同的页面之间的数据、Dataset对象实例、DataTable实例等),在何时释放?Sesstion End事件中,好像是不可能的;


A:你的类是不是页面的一个类?那么打开一个新页面自然要产生你一个类的新实力!

B:Dataset,DataTable也罢,只要网页发生page_unload事件,立马就消失!