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事件中,好像是不可能的;===============
问题如上所述,有请高人指点。
在保存会话状态和不同页面间交换的数据时,我们没有用Sesstion、Application等对像,而是自己另外写了一个与Sesstion工作类似的“列表类”,里面每一个项目用一个Key去访问它,每一个项目是一个Object,这样,我们的“列表类”中就可以保存任何的数据类型。 当然,“列表类”中的KEY要求必须要是唯一的,所以,我们就采用了Session ID来作为“列表类”的Key。 我们在UI端,采用了“模板视图”的模式,通在生成了Page类的子类,来定义每一个页面中大部分重复的动作,比如,在装入页面以后,要判断用户使用软件的许可、使用模块的权限,所以,我们在实现“模板视图”时,便先取得当前的Sesstion ID,再去查找服务器进程中的那个“列表类”,就得到当前会话的所有状态信息;2、问题产生
上述做法,产生了如下两个问题:
A、经常会出现用户登录以后断线的情况,经测试,发现是因为在打用新的IE窗口时,IIS产生了一个新的Session ID; B、在列表类中保存的对像(比如向导界面中不同的页面之间的数据、Dataset对象实例、DataTable实例等),在何时释放?Sesstion End事件中,好像是不可能的;===============
问题如上所述,有请高人指点。
会话SessionID本来就是如此,打开新窗口的时候浏览器就是作为新的会话,跟iis都没有关系。如果你要让不同的会话也被登记为相同的 ID,你应该自己设计别的东西,例如使用cookie保存身份id值。当然,使用cookie保存的id在逻辑上就跟sessionID根本不是同一个作用域范围。在“不同页面间交换的数据时”不应该使用会话状态来保存数据,特别是这个Key不应该随便起。B:
使用 Session_End 也可以,你自己定时(例如记录会话最后一次访问的时间判断超时)去清理也可以。
对于 第一个
最好的 替换 就是 使用 cookies 来保存 登录信息.B
你的数据 应该是登录用户 使用时候读取 输出给页面 后就释放掉和
这个东西 和Session_End没联系.
——————————————————————————————————————————
同时在线的不同客户端的IP完全可以相同。至于“或其他之类的东西”又是指什么呢?前边已经说了这个东西可以是什么,只是你不愿意看中而已。
现在主要的问题就是:
1.在新打开的窗口中产生了新的会话,如何避免产生新的会话是我想要达到的目的。(查找资料试用Response.ApplyAppPathModifier方法也没有解决,不知道用src连接的地方会不会产生新的会话,因为在使用src连接的时候,我没有用Response.ApplyAppPathModifier方法,只有href连接的地方才使用)
2.多页面的参数传递方式,比如传递一个table或则其他的对象。现在我是用的一个类似与session的东西存储传递的参数,只不过不好把握参数的释放时机,因为客户端的操作设计到刷新,前进后退等操作。用session_end内执行释放,也只有等到超时的时候才执行。我用了session_start事件的,在里面执行了一些初始化的操作。不知道大家是怎么做的~~~
A:你的类是不是页面的一个类?那么打开一个新页面自然要产生你一个类的新实力!B:Dataset,DataTable也罢,只要网页发生page_unload事件,立马就消失!
1、打开新的IE 窗口时要生成新的Sesstion ID;关于这问题,综合大家的意见和网上找到的点子,我想到的解决方法就是用其它的什么唯一ID作为那个Key,然后放在URL的参数中传到客户端,客户端可以用Hiden元素来缓存。这样,就实现了整会话的管理; 关于此点,不知道大家有没有更好的法子来解决,请指点; 2、就是在页面间跳转时的一些信息的保存,这些信息的释放时机;举个例子,我在客户端做了一个“向导”,第一步输入了一些信息,第二步再输入一些信息,那么,第一步中的信息在转到第二步的时候,肯定是需要保存的。所以,我们就需要保存起来。我们现在是通过Key保存在那个“列表对象(和Session类似)”中,如果用户正常操作的话(比如说点击页面中的“返回、关闭”之类的Button),这些保存的信息可以正常释放,如果用户直接关IE,或是用前进、后退等功能,这些保存的信息又怎么释放?在服务器端加Timer用超时清除么?
请大家谈谈你们的想法。谢谢。