关于ASP.net中的会话状态问题,有请高人。 ( 积分: 100 )

  • 主题发起人 主题发起人 人生如路
  • 开始时间 开始时间

人生如路

Unregistered / Unconfirmed
GUEST, unregistred user!
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事件中,好像是不可能的;
===============
问题如上所述,有请高人指点。
 
顶!!!
 
up up up...........
 
CSDN中的回复:
===============

amandag(高歌) ( ) 信誉:100 Blog 加为好友 2007-6-12 12:20:55 得分: 0



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


Top
honkerhero(做事先做人) ( ) 信誉:100 Blog 加为好友 2007-6-12 12:25:43 得分: 0



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


Top
sp1234(左牵黄 右擎苍) ( ) 信誉:98 Blog 加为好友 2007-6-12 12:40:46 得分: 0



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


Top
sp1234(左牵黄 右擎苍) ( ) 信誉:98 Blog 加为好友 2007-6-12 12:45:25 得分: 0



会话就是真正的会话,按照它的功能需求,它不能依赖于登录的用户名这个概念来设计。


Top
wangyanyan(不犯错误,一定会错,因为不犯错误的人一定没有去尝试。) ( ) 信誉:96 Blog 加为好友 2007-6-12 12:52:53 得分: 0



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


Top
hertcloud(·£孙子兵法£·) ( ) 信誉:100 Blog 加为好友 2007-6-12 13:04:15 得分: 0



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



Top
arcore([CTC]中的人生如路) ( ) 信誉:100 Blog 加为好友 2007-6-14 13:48:33 得分: 0



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


Top
arcore([CTC]中的人生如路) ( ) 信誉:100 Blog 加为好友 2007-6-14 13:51:26 得分: 0



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


Top
wxndiablo(刺客) ( ) 信誉:100 Blog 加为好友 2007-6-14 13:54:56 得分: 0



mark


Top
sp1234(左牵黄 右擎苍) ( ) 信誉:98 Blog 加为好友 2007-6-14 14:01:35 得分: 0



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


Top
arcore([CTC]中的人生如路) ( ) 信誉:100 Blog 加为好友 2007-6-14 15:03:04 得分: 0



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


Top
arcore([CTC]中的人生如路) ( ) 信誉:100 Blog 加为好友 2007-6-14 17:34:42 得分: 0



大家帮我看看,顶一下也可以~~~


Top
growleaf() ( ) 信誉:100 Blog 加为好友 2007-6-14 21:53:47 得分: 0



怎么没有人呢,帮顶了~~~


Top
chaofd() ( ) 信誉:100 Blog 加为好友 2007-6-14 22:02:47 得分: 0



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

A:你的类是不是页面的一个类?那么打开一个新页面自然要产生你一个类的新实力!
B:Dataset,DataTable也罢,只要网页发生page_unload事件,立马就消失!


Top
Jinglecat(晓风残月) ( ) 信誉:94 Blog 加为好友 2007-6-14 22:03:57 得分: 0



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


Top
chaofd() ( ) 信誉:100 Blog 加为好友 2007-6-14 22:05:50 得分: 0



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


Top
ericfine(埃里克) ( ) 信誉:98 Blog 加为好友 2007-6-14 22:12:10 得分: 0



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


Top
arcore([CTC]中的人生如路) ( ) 信誉:100 Blog 加为好友 2007-06-15 08:53:50 得分: 0


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

请大家谈谈你们的想法。谢谢。
 
如果你想花最少的钱学习流行的计算机技术,本人低价提供
计算机专业高清晰 视 频 教 程,所有教程由业内名家讲解,物超所值,
所有光盘4元/张,特快专递全国三天内到货.
联系方式:手 机:1 3 5 76145612(手机联系佳) Q Q:108410943
E-mail:ncncldjjg@126.com
1、Oracle9iOCP(Oracle认证专家DBA)视频教程(23CD)
2、SQL语言、数据挖掘、SQLServer2000视频教程(6CD)
3、计算机网络原理视频教程(4CD)
4、计算机实用组网技术视频教程(3CD)
5、MCSE(微软认证系统工程师)认证视频教程(11CD)
6、windows2003即学即会视频教程(6CD)
7、J2EE Web程序开发定向班/Java就业班视频教程
(java基础jsp核心技术UML设计)(13CD)
8、J2EE基础高级案例分析视频教程(9CD)
9、马士兵J2SE入门与精通(含坦克大战、BBS实例)视频教程(6CD)
10、java语言深入详解视频教程(12CD)
11、java技术从入门到精通视频教程(21CD)
12、javascript全接触视频教程(13CD)
13、各类网站源程序(9CD)
14、unix原理视频教程(3CD)
15、Linux软件开发工程师(C语言)视频教程(4CD)
16、Linux配置、管理、优化实战工程师视频教程(8CD)
17、Linux内核编程视频教程(11CD)
18、C语言详解视频教程(2CD)
19、VC++6.0(MFC)开发技术术详解视频教程(6CD)
20、ASP.NET中文视频教程(3CD)
21、洪恩C#入门多媒体教程(1CD)
22、XML技术视频教程(2CD)
23、操作系统视频教程(3CD)
24、网络技术基础视频教程(2CD)
25、数据结构视频教程(5CD)
26、清华大学计算机专业多媒体教程(数据结构、汇编、编译原理等)(13CD)
27、大学数学[离散数学线性代数概率与数理统计微积分]视频教程(22CD)
28、LearnKey Asp.Net (老外用英语讲课)(13CD)
29、LearnKey Asp.Net Webservice(老外用英语讲课)(5CD)
30、AppDev Asp.Net2.0 UsingC# (老外用英语讲课)(1CD)
31、APPDev .Net Framework(老外用英语讲课)(2CD)
32、林清安pro/e2001(野火版)视频教程(18CD)
33、深圳大学3D设计视频教程(4CD)
34、3DMAX建模视频教程(老外用英语讲课)(6CD)
35、3DMAX纹理与贴图材质灯光视频教程(老外用英语讲课)(5CD)
36、3DMAX格式500个常用模型库(4CD)
37、lightscape基础入门视频教程(2CD)
38、聚光制造(lightscape3.2入门与精通视频教程)(4CD)
39、coreldraw12中文版入门与精通swf格式视频教程(2CD)
 
后退
顶部