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事件中,好像是不可能的;===============
问题如上所述,有请高人指点。

解决方案 »

  1.   

    建议使用state server或sql server保存session,这样不容易丢失
      

  2.   

    不要用SESSIONID作KEY,使用用户名和IP自己根据实际需求写个算法生成一个KEY这样在用户打开新IE时,通过用户名和IP可知是同一用户,如果允许多登录,则用户名+多IP,否则,第二次换IP登录时,禁止登录,不过,你要有合适的方法来踢除下线用户
      

  3.   

    A: 
    会话SessionID本来就是如此,打开新窗口的时候浏览器就是作为新的会话,跟iis都没有关系。如果你要让不同的会话也被登记为相同的 ID,你应该自己设计别的东西,例如使用cookie保存身份id值。当然,使用cookie保存的id在逻辑上就跟sessionID根本不是同一个作用域范围。在“不同页面间交换的数据时”不应该使用会话状态来保存数据,特别是这个Key不应该随便起。B: 
    使用 Session_End 也可以,你自己定时(例如记录会话最后一次访问的时间判断超时)去清理也可以。
      

  4.   

    很不明白你为什么要自己写一个?这么关键的KEY不要用session,cookie,application
      

  5.   


    对于 第一个 
    最好的 替换 就是 使用 cookies 来保存 登录信息.B
    你的数据 应该是登录用户 使用时候读取 输出给页面 后就释放掉和
    这个东西 和Session_End没联系.
      

  6.   

    因为要在多个页面传递参数,我将参数保存在自定义的SESSION里面,如果读取输出后就释放,那么执行刷新操作的话,页面就会出现异常,因为保存的相关参数已经被释放掉了~~~
      

  7.   

    是不是自定义SESSIONID的生成就能解决这个问题牙,比如说根据IP或其他之类的东西生成能唯一表示该客户的ID。
      

  8.   

    比如说根据IP或其他之类的东西生成能唯一表示该客户的ID。
    ——————————————————————————————————————————
    同时在线的不同客户端的IP完全可以相同。至于“或其他之类的东西”又是指什么呢?前边已经说了这个东西可以是什么,只是你不愿意看中而已。
      

  9.   

    如果用前面提到的COOKIE,但客户端不启用的话,就不起作用了啊!!
    现在主要的问题就是:
    1.在新打开的窗口中产生了新的会话,如何避免产生新的会话是我想要达到的目的。(查找资料试用Response.ApplyAppPathModifier方法也没有解决,不知道用src连接的地方会不会产生新的会话,因为在使用src连接的时候,我没有用Response.ApplyAppPathModifier方法,只有href连接的地方才使用)
    2.多页面的参数传递方式,比如传递一个table或则其他的对象。现在我是用的一个类似与session的东西存储传递的参数,只不过不好把握参数的释放时机,因为客户端的操作设计到刷新,前进后退等操作。用session_end内执行释放,也只有等到超时的时候才执行。我用了session_start事件的,在里面执行了一些初始化的操作。不知道大家是怎么做的~~~
      

  10.   

    A、经常会出现用户登录以后断线的情况,经测试,发现是因为在打用新的IE窗口时,IIS产生了一个新的Session ID;   B、在列表类中保存的对像(比如向导界面中不同的页面之间的数据、Dataset对象实例、DataTable实例等),在何时释放?Sesstion End事件中,好像是不可能的;
    A:你的类是不是页面的一个类?那么打开一个新页面自然要产生你一个类的新实力!B:Dataset,DataTable也罢,只要网页发生page_unload事件,立马就消失!
      

  11.   

    没发现你这样做又什么好处Session 本来就是可以存 object
      

  12.   

    同意楼上的,放着Session不用,为何
      

  13.   

    为什么自己模拟个Session出来?
      

  14.   

    现在有问题的不是那个“自定义的列表对象”,我们可以先不考虑那个“自定义的列表对象”,就把它当成.net 中的Session吧。也就是说,我们在Sesstion中的每一项存了一个Object,这个Object保存了一个会话的所有信息,还包括一个会话中的一些临时的页面数据交换的临时信息等;现在的问题还是存在:
        1、打开新的IE 窗口时要生成新的Sesstion ID;关于这问题,综合大家的意见和网上找到的点子,我想到的解决方法就是用其它的什么唯一ID作为那个Key,然后放在URL的参数中传到客户端,客户端可以用Hiden元素来缓存。这样,就实现了整会话的管理;    关于此点,不知道大家有没有更好的法子来解决,请指点;    2、就是在页面间跳转时的一些信息的保存,这些信息的释放时机;举个例子,我在客户端做了一个“向导”,第一步输入了一些信息,第二步再输入一些信息,那么,第一步中的信息在转到第二步的时候,肯定是需要保存的。所以,我们就需要保存起来。我们现在是通过Key保存在那个“列表对象(和Session类似)”中,如果用户正常操作的话(比如说点击页面中的“返回、关闭”之类的Button),这些保存的信息可以正常释放,如果用户直接关IE,或是用前进、后退等功能,这些保存的信息又怎么释放?在服务器端加Timer用超时清除么?
        
        请大家谈谈你们的想法。谢谢。
      

  15.   

    zai ci lu guo !~