CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

为什么我网站上的session,cookie总莫名奇妙的丢失???????

楼主cc555()2006-09-04 10:02:31 在 .NET技术 / ASP.NET 提问

为什么我网站上的session,cookie总莫名奇妙的丢失???????  
   
  我检查了所有  
  Response.Cookies.Remove("UserID");  
  Response.Cookies.Clear();  
   
  Session.RemoveAll();  
  Session.Abandon();  
  等等  
  的地方,没有什么异常阿。  
  可就是有时候就自己清空了。  
  我设的session默认是20分钟的阿   。。。。!!!!!!!!!!1  
  why   ???????? 问题点数:100、回复次数:49Top

1 楼robertlvqing(苦海无边 回头无岸)回复于 2006-09-04 10:07:47 得分 0

这种情况频繁发生莫Top

2 楼hertcloud(·£孙子兵法£·)回复于 2006-09-04 10:07:52 得分 0

你的Cookies没有设置   Domain?  
  或者是Path不对?  
  把你的输出代码贴出来.Top

3 楼amnoh(会走路的鱼)回复于 2006-09-04 10:19:37 得分 10

Session是会丢失,这是正常的,  
  不过,LZ的情况好像是频繁丢失??那就要好好检查原因了,访问量特别大,也可能是某些未发现的地方不小心清空了?  
  建议楼主在同一服务器上,弄个很简单的程序试试,看看它的丢失情况怎样,以确定是你程序的问题,还是系统的问题Top

4 楼iflang(踩姑娘的小蘑菇)回复于 2006-09-04 10:27:17 得分 0

好怪啊...为什么会这样啊.以前没有遇到过,,,,不过作WEB开发的,,呵呵Top

5 楼zahuifan(杂烩饭)回复于 2006-09-04 10:31:07 得分 20

是不是访问量很大?可以试试为网站配置一个专门的应用程序池。Top

6 楼lovebanyi(风云)回复于 2006-09-04 10:47:18 得分 20

据说装了杀毒软件的有也会造成这样.我们公司的一个产品就这样了。不要让杀毒软件去扫描w3wp进程Top

7 楼heyidan(gopee)回复于 2006-09-04 10:49:50 得分 0

是不是設置了session的時間呢?設置了過期時間之後的話,一段時間之後session就丟失了。Top

8 楼yan63(silence like a cancer grows)回复于 2006-09-04 10:50:36 得分 0

如楼上各位说的,补充一下,config文件更改也可能会导致session清空,还有目录权限改变等,建议是否在工程内新建测试页面,使用session,在其他页面丢失时回头看看测试页的sessionTop

9 楼cc555()回复于 2006-09-04 11:15:43 得分 0

感谢回复,  
   
  我的Cookies没有Domain,Path,只是很简单的直接赋值,读取。  
  我的网站刚建,访问量不大。  
  我的session默认值是20分钟,可丢失的时候根本没到20分钟啊。!  
   
   
  yan63()   说的意思不太明白,可以说明白一点么?Top

10 楼babyuse(泡泡龙[lyl])回复于 2006-09-04 11:25:03 得分 10

是不是跨了多个虚拟目录了?那样肯定会丢失的Top

11 楼rhathymia(や擦肩而過や)回复于 2006-09-04 11:30:18 得分 20

四:session变量“丢失”的问题  
   
          谈到了那么多的概念,终于可以说道实质性的问题了,session对象是web应用程序中最重要的对像之一,正是它的存在,使得我们可以在跨网页间传送数据,分辨不同用户成为可能。我们只要将变量制定给session即可实现。这一过程即session("temp")=temp即可。但最近不少网友都有这样的疑问,就是当我们在一个网页间设定了一个session变量后,到另一个网页,却消失了。这是什么样的原因呢。  
        根据上面的概念,我们可以将其原因,和处理办法总结如下。  
        1:asp网页跨了多个web应用程序:  
        这个原因就是你的另一个网页可能是另一个web应用程序。以前,一些资料过分的强调了会话变量的单一性,好像一个用户连接到一个web主机之后,只可能创建一个会话变量,这是不对的,分辨会话变量的依据正是我们上面所提到的web应用程序范围,而不是单独根据用户而建立的,你可以试一试下面的一段代码。  
  test.asp  
  <%   @   language=vbscript   %>  
  <%  
  session("temp")="temp"  
  Response.Write   session.SessionID                   'sessionID用来分辨一个应用程序间的单独客户。  
  %>  
   
  将test.asp分别拷贝到两个不同的虚拟目录下。你就可以看到,他是两个不同的值了。所以,可能你的网页跨了不同的应用程序。  
        当然,这种情况对于初学者可能碰到,对于有经验的人可能犯的是这样的错误,即他们本身为一个根目录,但在制定虚拟目录时将其子目录又设为一个虚拟目录了,就如同我们上面提到的第二个表结构一样。这样他同样成为了两个不同的web应用程序。也就不难解释为什么会出错了。  
   
        2:可能是启动了多个同一应用程序。  
        第一种情况很好发现,也容易改正,但这第二种情况就不容易发现,也较难改正。这里我们引入一个另一个的概念。多个同一应用程序共存,(好长呀,关键是微软的概念我忘了,这个是我自己起的。呵呵!),它的意思从这个定义上很好理解,就是对于同一个应用程序。同一时间可以在内存中存在多个。如我们常见的acdsee.exe,你可以通过点击启动多个acdsee.exe。而另外一种则不能,我们就不说它的定义了(如果说的话,就是相同应用程序不共存,呵呵!)在同一时间内,如果已经启动了一个应用程序,则不能再启动相同的应用的应用程序了。如foxmail.exe,当你启动了一个foxmail.exe后,就只可能在内存中存在一个foxmail.如果你在启动,则不会再开一个foxmail窗口了。  
          而我们的ie属于前者,你可以通过点击ie,启动多个ie应用程序。此时,我们做下面另一个测试。你将上面的代码test.asp放入一个虚拟目录中。然后,你点击ie启动(注意:是通过点击Ie启动,不是按CTRL+N,也不是在一个ie窗口点击文件,重新打开一个窗口)此时,你可以发现,他们虽然是同一个地址,同一个用户,但sessionID还是不同的,当然,你还可以建另一个文件。如  
  test2.asp  
  <%   @   language=vbscript   %>  
  <%  
  response.write   session("temp")  
  %>  
  这时,你在另一个ie窗口下,你就会发现session("temp")为空,也就是说,我们刚才明明在test.asp中附了值,而且test2.asp和test.asp在同一虚拟目录下,但session("temp")却丢失了。原来,相对于相同的asp应用程序。不同的ie相对的却是不同的asp应用程序。(有点像绕口令难懂是吧。)不过,我们已经明白了它的起因,相信不难解决他。  
          这里还要注意的是,我们刚才一再提到的是通过点击Ie,而不是通过按CTRL+N,也不是在一个ie窗口点击文件,重新打开一个窗口,这里要说明的是如果你通过在一个ie窗口打开的窗口,它属于派生窗口,而不是共生窗口,就是说,此时的另一个窗口属于和其上一个窗口是继承关系,属于同一个应用程序范围。  
        3:连接不当  
        其实,大部分的网友碰到的问题是通过点击页面中的连接新开窗口而发现session变量丢失的。他同按ctrl+N新开窗口的意义相同。但此时为什么会出问题呢?我们来分析一下它的连接方式。可能为<a   href="xx.asp"   traget=_blank>click   me   </a>通过这样点击的连接同ctrl+n   是相同的,应该不会出问题。还有一种连接式通过脚本控制的如window.open   "xx.asp","name","toolbar=no"这样的代码,他就可能发生这样的问题。如果通过点击ie开了多个共生窗口(许多网友为了节省时间,他们喜欢开多个窗口。比如我。)。就是他可能在新开的窗口中如果含有相同的name的窗口。则此时,就可能发生连接不当导致session丢失,其实,原因还是通第二种一样。还有一种更极端的方式开新窗口,通过用document.write   在一个脚本中动态写出新的页面,而该页面的url是不存在的,这样就更可能出问题了,应为session正是通过url,http来追踪的。所以如果其页面地址是动态的话。则session就根本无法追踪了。  
   
        相信通过以上例子的分析,可能会解释你在应用session中出现的大部分问题。但不是全部(如过你禁用cookie的话,呵呵!)但是,如果你将以上的概念都弄懂,则可以解决你在应用session中出现的所用问题了。      
   
  转自:http://www3.ccw.com.cn/club/essence/200103/601.htm,仅供参考    
  Top

12 楼cc555()回复于 2006-09-04 11:47:05 得分 0

再up!Top

13 楼cc555()回复于 2006-09-04 15:52:09 得分 0

还是没解决。。。。。。。。。  
  :(Top

14 楼amnoh(会走路的鱼)回复于 2006-09-04 15:58:35 得分 10

创建一个新的WEB项目,一定要新建个虚拟目录让它运行,然后只写一个页面,就是写个Session变量,别的不要干,然后你等着测试,看会不会出现丢失,  
  如果丢失,就是系统方面的问题;  
  如果不丢失,就是目前程序中可能存在问题;  
  先确定一下大致的范围Top

15 楼msvbprogrammer(關)回复于 2006-09-04 16:11:36 得分 0

在web.config中修改一下sessionState  
   
  换一种session方案试试Top

16 楼msvbprogrammer(關)回复于 2006-09-04 16:19:22 得分 0

不过搂主说的是cookie也丢,session   id   存在cookie中,所以cookie丢了,session必定丢。cookie是客户端的,估计是客户端的问题吧,检查一下安全、信任什么的。。。。Top

17 楼cc555()回复于 2006-09-04 16:32:27 得分 0

可以肯定不是系统的问题,可程序中也实在是找不出什么问题来啊。。。。  
   
  web.config的sessionState俺用的是sessionState   mode="InProc",这应该没错吧,  
   
  。。Top

18 楼cc555()回复于 2006-09-04 16:34:26 得分 0

ie客户端都是默认,没有做什么限制。  
   
  关键是不光我一个,别人上网站也是这样,,,那就更不会是ie客户端的事了吧。。Top

19 楼msvbprogrammer(關)回复于 2006-09-04 16:46:53 得分 0

设置web.config的sessionState中的cookieless="true",这时在url里会看到session   id,如果这样能解决的话,那就是客户端的问题,与服务器端代码无关了Top

20 楼msvbprogrammer(關)回复于 2006-09-04 16:50:05 得分 0

或者这样设置:  
  <sessionState    
                          mode="StateServer"  
                          stateConnectionString="tcpip=127.0.0.1:42424"                         cookieless="false"    
                          timeout="20"    
          />  
  然后在服务器上把"asp.net状态"服务打开,再试一下  
  Top

21 楼isline(缘清)回复于 2006-09-04 16:50:34 得分 0

服务器端的asp_net重启或你上传了bin目录会导致session丢失。Top

22 楼seaonce(雨花中的小皮鞋)回复于 2006-09-04 16:52:52 得分 10

SESSION很容易被服务器中的其它程序抢夺资料,导致SESSION被挤Top

23 楼seaonce(雨花中的小皮鞋)回复于 2006-09-04 16:53:11 得分 0

是资源Top

24 楼anheizhizi(目标:★★★★★)回复于 2006-09-04 17:12:48 得分 0

有   Session.Abandon()   ?      
   
  备注:  
  一旦调用了   Abandon,当前会话就不再有效,然后可以启动一个新会话。Abandon   导致引发   End   事件(对下一个请求引发一个新的   Start   事件)。仅当   Mode   为   InProc   时才支持   End   事件。  
   
  Top

25 楼Softeer(还差一点疯掉了~~~)回复于 2006-09-04 17:33:10 得分 0

用的是windows   2003?Top

26 楼jack7659()回复于 2006-09-04 17:34:13 得分 0

up!Top

27 楼longsky(长空)回复于 2006-09-04 23:23:35 得分 0

服务器的问题,以前我的程序在多个商业性的虚拟主机上没有发生Session丢失,但有两台虚拟空间上,时常发生。因为是买的小空间,也没有权查服务器的问题,具体系统在配置上有什么不同,就不清楚了。  
   
  建议LZ换个空间试一下是否程序的问题。Top

28 楼cc555()回复于 2006-09-05 10:03:13 得分 0

 
   
  这种情况在俺买的虚拟主机上和本地机器上测试都出现过,  
  应该不是空间的问题,  
   
  大家说说如果是程序上的问题,那会是什么情况下的呢?  
   
  SESSION很容易被服务器中的其它程序抢夺资料,导致SESSION被挤  
  这是一种可能,  
   
  别的呢????Top

29 楼robertlvqing(苦海无边 回头无岸)回复于 2006-09-05 10:18:07 得分 0

还没解决啊   。。。转一篇帖子  
  Session丢失原因与解决方案小结    
  Posted   on   2005-05-13   15:50   冰戈   阅读(1448)   评论(4)     编辑   收藏   引用   收藏至365Key   所属分类:   技术随笔      
  可能的原因1:  
   
   
  win2003   server下的IIS6默认设置下对每个运行在默认应用池中的工作者进程都会经过20多个小时后自动回收该进程,造成保存在该进程中的session丢失。    
   
   
  因为Session,Application等数据默认保存在运行该Web应用程序的工作者进程中,如果回收工作者进程,则会造成丢失。    
   
   
  解决办法:    
   
  修改配置,设置为不定时自动回收该工作者进程,比如设置为当超出占用现有物理内存60%后自动回收  
   
  该进程。通过使用默认应用程序池,可以确保多个应用程序间互相隔离,保证由于一个应用程序的崩溃不会影响另外的Web应用程序。还可以使一个独立的应用程序运行在一个指定的用户帐号特权之下。  
   
  如果使用StateServer方式或者Sql   Server数据库方式来保存Session,则不受该设置的影响。  
   
   
  可能的原因2:    
   
  系统要运行在负载平衡的   Web   场环境中,而系统配置文件web.config中的Session状态却设置为InProc(即在本地存储会话状态),导至在用户访问量大时,Session常经超时的情况。引起这个现象的原因主要是因为用户通过负载平衡IP来访问WEB应用系统,某段时候在某台服务器保存了Session的会话状态,但在其它的WEB前端服务器中却没有保存Session的会话状态,而随着并发量的增大,负载平衡会当作路由随时访问空闲的服务器,结果空闲的服务器并没有之前保存的Session会话状态。  
   
   
  解决办法:    
  1.当您在负载平衡的   Web   场环境中运行   ASP.NET   Web   应用程序时,一定要使用   SqlServer   或   StateServer   会话状态模式,在项目中我们基于性能考虑并没有选择SqlServer模式来存储Session状态,而是选择一台SessionStateServer   服务器来用户的Session会话状态。我们要在系统配置文件web.config中设置如下:    
  <sessionState   mode="StateServer"   cookieless="false"   timeout="240"   stateConnectionString="tcpip=192.168.0.1:42424"   stateNetworkTimeout="14400"   />    
   
  还要添加一项    
  <machineKey   validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4"   decryptionKey="5FC88DFC24EA123C"   validation="SHA1"/>      
   
  2.   我们同时还要在SessionStateServer   服务器中启动ASP.NET   State   Service服务,具体设置:控制面板>>管理工具>>服务>>ASP.NET   State   Service,把它设为自动启动即可。      
   
  3.   每台前端WEB服务的Microsoft“Internet   信息服务”(IIS)设置    
                            要在   Web   场中的不同   Web   服务器间维护会话状态,Microsoft“Internet   信息服务”(IIS)   配置数据库中   Web   站点的应用程序路径(例如,\LM\W3SVC\2)与   Web   场中所有   Web   服务器必须相同。大小写也必须相同,因为应用程序路径是区分大小写的。在一台   Web   服务器上,承载   ASP.NET   应用程序的   Web   站点的实例   ID   可能是   2(其中应用程序路径是   \LM\W3SVC\2)。在另一台   Web   服务器上,Web   站点的实例   ID   可能是   3(其中应用程序路径是   \LM\W3SVC\3)。因此,Web   场中的   Web   服务器之间的应用程序路径是不同的。我们必须使Web   场Web   站点的实例   ID   相同即可。你可以在IIS中把某一个WEB配置信息保存为一个文件,其他Web   服务器的IIS配置可以来自这一个文件。您如果想知道具体的设置请访问Microsoft   Support网站:    
   
   
   
  补充一些相关资料:  
  PRB:   Session   Variables   Are   Lost   If   You   Use   FRAMESET   in   Internet   Explorer   6.0  
  http://support.microsoft.com/kb/323752/EN-US/#  
   
  PRB:   Session   Data   Is   Lost   When   You   Use   ASP.NET   InProc   Session   State   Mode  
  http://support.microsoft.com/?id=324772  
   
  PRB:如果您使用   SqlServer   或   StateServer   会话模式   Web   场中会丢失会话状态  
  http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056  
     
  ASP.NET   Session   State   FAQ  
  http://www.eggheadcafe.com/articles/20021016.asp  
  Top

30 楼heqi915(秋天的毛毛虫)回复于 2006-09-05 10:27:06 得分 0

关注中Top

31 楼cc555()回复于 2006-09-05 11:10:40 得分 0

thanks   ,看看。Top

32 楼cc555()回复于 2006-09-05 16:34:15 得分 0

 
   
   
  我发现了一点,  
   
   
  是不是跟用iframe有关系???????????  
  我发现,凡是用iframe的页面都会出现这种情况,,,,,,  
   
   
   
  怎么办啊???????  
   
  sos   !!!Top

33 楼cc555()回复于 2006-09-06 13:19:02 得分 0

up!!!Top

34 楼damnhe(Grubby' s fans)回复于 2006-09-06 13:23:55 得分 0

把seesion值存到数据库中去,看它怎么丢Top

35 楼cc555()回复于 2006-09-06 16:29:12 得分 0

 
  搜索了一下,  
   
  有人说:  
   
  客户端cookies的个数有一个最大值,根据浏览器不同也有所不同,ie大概在20个好像,一旦cookies超过这个数就会出现cookie值丢失的现象。  
   
   
   
   
  我的可能就是这个原因,  
  我cookie丢失的页面中的cookie确实比较多。。。。。。。。。。Top

36 楼cc555()回复于 2006-11-15 13:08:18 得分 0

再顶一顶!Top

37 楼zljblue(随便逛逛)回复于 2006-11-15 13:18:49 得分 0

页面里是不是有框架或占位符,以前做的一个网站因为以上情况出现过SESSION丢失的情况Top

38 楼cc555()回复于 2006-11-15 15:06:50 得分 0

对,  
  是有框架,  
  怎么解决阿???????????Top

39 楼cc555()回复于 2006-11-15 17:38:10 得分 0

up!Top

40 楼libinguest(上善若水)回复于 2006-11-15 17:49:24 得分 0

DomainTop

41 楼asdasdy()回复于 2006-11-15 18:53:07 得分 0

dOMIN   设置?Top

42 楼cc555()回复于 2006-11-16 08:10:52 得分 0

有DomainTop

43 楼cc555()回复于 2006-11-16 12:36:20 得分 0

upTop

44 楼aaajedll(Kayへ只要过程)回复于 2006-11-16 13:31:54 得分 0

upTop

45 楼cc555()回复于 2006-11-16 17:11:09 得分 0

顶!Top

46 楼handi(handi)回复于 2006-11-16 17:25:03 得分 0

2003   还是2005   呢?  
  如果是2005,   你有没有什么动作删除folder了?  
  如果删除folder,系统就会重新启动你的应用程序池。  
  Top

47 楼cc555()回复于 2006-11-16 19:10:22 得分 0

2003Top

48 楼softfire007(为天下美女幸福而生!)回复于 2006-11-16 19:11:40 得分 0

习惯就好!Top

49 楼softfire007(为天下美女幸福而生!)回复于 2006-11-16 19:12:25 得分 0

呵呵Top

相关问题

关键词

得分解答快速导航

  • 帖主:cc555
  • amnoh
  • zahuifan
  • lovebanyi
  • babyuse
  • rhathymia
  • amnoh
  • seaonce

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo