关于ASP.net中的会话状态问题,有请高人。

arcore 2007-06-12 12:07:29
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事件中,好像是不可能的;

===============
问题如上所述,有请高人指点。
...全文
442 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
growleaf 2007-06-18
  • 打赏
  • 举报
回复
zai ci lu guo !~
growleaf 2007-06-16
  • 打赏
  • 举报
回复
继续顶~~~
arcore 2007-06-15
  • 打赏
  • 举报
回复
现在有问题的不是那个“自定义的列表对象”,我们可以先不考虑那个“自定义的列表对象”,就把它当成.net 中的Session吧。也就是说,我们在Sesstion中的每一项存了一个Object,这个Object保存了一个会话的所有信息,还包括一个会话中的一些临时的页面数据交换的临时信息等;

现在的问题还是存在:
1、打开新的IE 窗口时要生成新的Sesstion ID;关于这问题,综合大家的意见和网上找到的点子,我想到的解决方法就是用其它的什么唯一ID作为那个Key,然后放在URL的参数中传到客户端,客户端可以用Hiden元素来缓存。这样,就实现了整会话的管理;

关于此点,不知道大家有没有更好的法子来解决,请指点;

2、就是在页面间跳转时的一些信息的保存,这些信息的释放时机;举个例子,我在客户端做了一个“向导”,第一步输入了一些信息,第二步再输入一些信息,那么,第一步中的信息在转到第二步的时候,肯定是需要保存的。所以,我们就需要保存起来。我们现在是通过Key保存在那个“列表对象(和Session类似)”中,如果用户正常操作的话(比如说点击页面中的“返回、关闭”之类的Button),这些保存的信息可以正常释放,如果用户直接关IE,或是用前进、后退等功能,这些保存的信息又怎么释放?在服务器端加Timer用超时清除么?

请大家谈谈你们的想法。谢谢。
arcore 2007-06-15
  • 打赏
  • 举报
回复
^o^

^0^

^O^

~_~

可爱的排骨 2007-06-14
  • 打赏
  • 举报
回复
为什么自己模拟个Session出来?
chaofd 2007-06-14
  • 打赏
  • 举报
回复
同意楼上的,放着Session不用,为何
Jinglecat 2007-06-14
  • 打赏
  • 举报
回复
没发现你这样做又什么好处

Session 本来就是可以存 object
chaofd 2007-06-14
  • 打赏
  • 举报
回复
A、经常会出现用户登录以后断线的情况,经测试,发现是因为在打用新的IE窗口时,IIS产生了一个新的Session ID;

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


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

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

不知道大家是怎么做的~~~
  • 打赏
  • 举报
回复
比如说根据IP或其他之类的东西生成能唯一表示该客户的ID。
——————————————————————————————————————————
同时在线的不同客户端的IP完全可以相同。至于“或其他之类的东西”又是指什么呢?

前边已经说了这个东西可以是什么,只是你不愿意看中而已。
刺客 2007-06-14
  • 打赏
  • 举报
回复
mark
arcore 2007-06-14
  • 打赏
  • 举报
回复
是不是自定义SESSIONID的生成就能解决这个问题牙,比如说根据IP或其他之类的东西生成能唯一表示该客户的ID。
arcore 2007-06-14
  • 打赏
  • 举报
回复
因为要在多个页面传递参数,我将参数保存在自定义的SESSION里面,如果读取输出后就释放,那么执行刷新操作的话,页面就会出现异常,因为保存的相关参数已经被释放掉了~~~
wangyanyan 2007-06-12
  • 打赏
  • 举报
回复
很不明白你为什么要自己写一个?这么关键的KEY不要用session,cookie,application
  • 打赏
  • 举报
回复
会话就是真正的会话,按照它的功能需求,它不能依赖于登录的用户名这个概念来设计。
  • 打赏
  • 举报
回复
A:
会话SessionID本来就是如此,打开新窗口的时候浏览器就是作为新的会话,跟iis都没有关系。如果你要让不同的会话也被登记为相同的 ID,你应该自己设计别的东西,例如使用cookie保存身份id值。当然,使用cookie保存的id在逻辑上就跟sessionID根本不是同一个作用域范围。

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

B:
使用 Session_End 也可以,你自己定时(例如记录会话最后一次访问的时间判断超时)去清理也可以。
honkerhero 2007-06-12
  • 打赏
  • 举报
回复
不要用SESSIONID作KEY,使用用户名和IP自己根据实际需求写个算法生成一个KEY

这样在用户打开新IE时,通过用户名和IP可知是同一用户,如果允许多登录,则用户名+多IP,否则,第二次换IP登录时,禁止登录,不过,你要有合适的方法来踢除下线用户
amandag 2007-06-12
  • 打赏
  • 举报
回复
建议使用state server或sql server保存session,这样不容易丢失
加载更多回复(1)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧