当前位置:编程学习 > C#/ASP.NET >>

Session奇怪丢失,请高手指招

程序已经放置服务器,北京,河南,上海,杭州等等,其他省份用户使用没有问题,可今天在江苏某一个用户就出现了很奇怪的问题,登陆成功以后,点击后台页面中的任何一个,交互事件按钮就会丢失Session,然后重返登陆界面,更怪的是,不止他一台其他,他试了其他许多电脑,包括不同场合,家里,网吧,甚至电信,都是同样的问题,真是不知何解(我感觉是不是和当地的DNS有关呢)

希望高手能帮忙看看,谢了. --------------------编程问答-------------------- 呵呵....难道你和"江苏"有"仇"?

  不明白,帮顶!!!!! --------------------编程问答-------------------- session丢失和IIS服务器及应用程序有关系吧,怎么会扯到DNS去了。。。 --------------------编程问答--------------------
引用 2 楼 guilipan 的回复:
session丢失和IIS服务器及应用程序有关系吧,怎么会扯到DNS去了。。。

的确是这样,但上百个各地省份的用户在使用过程中都没有问题的,可就坦坦在他这个用户这里出了问题 --------------------编程问答-------------------- 和那台服务器有关系 --------------------编程问答--------------------
引用 3 楼 jacks_cn 的回复:
引用 2 楼 guilipan 的回复:
session丢失和IIS服务器及应用程序有关系吧,怎么会扯到DNS去了。。。

的确是这样,但上百个各地省份的用户在使用过程中都没有问题的,可就坦坦在他这个用户这里出了问题

同样的服务器,为什么其他用户一点问题也没有,就那用户出现在状态,服务器上也没做任何IP的限制 --------------------编程问答--------------------
引用 4 楼 criedshy 的回复:
和那台服务器有关系

同样的服务器,为什么其他用户一点问题也没有,就那用户出现在状态,服务器上也没做任何IP的限制 --------------------编程问答-------------------- --------------------编程问答-------------------- 排除法:
用他的用户名在非江苏的地方登录试试呢。。。
再用其他用户名让那个用户在江苏登录试试。。。 --------------------编程问答--------------------
引用 8 楼 zsz1112 的回复:
排除法:
用他的用户名在非江苏的地方登录试试呢。。。
再用其他用户名让那个用户在江苏登录试试。。。


这种排除法,我也试了,都是正常的
他的用户名,在其他地方可用
其他用户名,在他电脑上也不可用 --------------------编程问答--------------------
引用 9 楼 jacks_cn 的回复:
引用 8 楼 zsz1112 的回复:
排除法:
用他的用户名在非江苏的地方登录试试呢。。。
再用其他用户名让那个用户在江苏登录试试。。。


这种排除法,我也试了,都是正常的
他的用户名,在其他地方可用
其他用户名,在他电脑上也不可用



那就出在他的电脑上的问题啦! 是不是IIS的配置问题! --------------------编程问答-------------------- 顶10楼! --------------------编程问答-------------------- 我怎么总觉得是人的问题。。  
一定是那个人RP不好,得罪了命运大神,结果惹祸上身~~~
哎呀呀,太可怕了。。 --------------------编程问答-------------------- 最烦就是session了 --------------------编程问答-------------------- 这个用户禁用了cookies,asp.net下session是基于cookies的,
可以使用无 Cookie 会话实现在禁用cookie的情况使用Session, --------------------编程问答--------------------
引用 14 楼 badxpgy 的回复:
这个用户禁用了cookies,asp.net下session是基于cookies的,
可以使用无 Cookie 会话实现在禁用cookie的情况使用Session,

你这种解法,是我第一感觉,但却不是,留意下我的提问,是不光他的电脑,他曾试过在其他电脑,包含网吧,甚至电信,都是出现了这种问题,

二,不会出在服务器的问题上,因为,我同时用另一台服务器做了测试,也不行,也就是说,二台服务器,同样的程序,在他的电脑上,都不行 --------------------编程问答-------------------- 而且,Session我也换了保存方式,现在启用了StateServer的Session保存模式,还是不行 --------------------编程问答-------------------- 你可以把他的账号拿过来在你电脑上测试一下,如果行的话,说明是他电脑设置问题。 --------------------编程问答-------------------- 无解,

最终解决办法:使用Cookies --------------------编程问答--------------------
asp.net Session的实现:
  asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
  ASP.NET中Session的状态保持方式
  ASP.NET提供了Session对象,从而允许程序员识别、存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息。Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件。程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。
  在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。
  ASP.NET中Session的状态保持是由web.config文件中的<system.web>标记下的<sessionstate>标记的mode属性来决定的。该属性有四种可能的值:Off、Inproc、StateServer和SQlServer.设为Off会禁用Session.
  Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。
  为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,来使用这个Windows服务提供的状态管理方法。
  除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下:
  mode=”StateServer”
  stateConnectionString="tcpip=127.0.0.1:42424"
  使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。
  另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两国文件存放在下面路径中:
  <%SYSTEMDRIVER%>\Winnt\Microsoft.NET\Framework\<%version%>\
  要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe
  osql -s [server name] -u [user] -p [password] <InstallSqlState.sql
  例如:osql -s (local) -u as -p “”-i InstallSqlState.sql
  做好必要的数据库准备工作后,将web.config文件中的sessionstate元素的mode属性改为”sqlserver”,并指定SQL连接字符串。具体如下:
  mode="SQLServer"
  sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"
  使用SQLServer模式处了可以使Session的状态不依赖于IIS服务器之外,还可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大的可靠性。
  丢失原因:
  转(1):Asp.net 默认配置下,Session莫名丢失的原因及解决办法
  正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。
  这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。
现在我就把原因和解决办法写出来。原因:由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode='InProc'stateConnectionString='tcpip=127.0.0.1:42424'sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes'cookieless='true'timeout='60'/>
  我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感)。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。[asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。]
  哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
  1、配置文件中processModel标签的memoryLimit属性
  2、Global.asax或者Web.config文件被更改
  3、Bin文件夹中的Web程序(DLL)被修改
  4、杀毒软件扫描了一些.config文件。
  更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications(链接:http://support.microsoft.com/kb/316148/EN-US/)
  解决办法:
  前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。
      现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。
      除此之外,我们还可以将Session通过其他电脑的StateService来保存[如使用状态服务器]。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。
      如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。
      在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
  如:
  [Serializable]
  public class MyClass
  {
    ......
  }
  具体的序列化相关的知识请参这里(http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/objserializ.asp#objserializ_topic4)。
  至此,问题解决。
--------------------编程问答-------------------- --------------------编程问答-------------------- 不明白,帮顶!~ --------------------编程问答-------------------- 有点蒙,学习。。。 --------------------编程问答-------------------- 。。你写一个简单点的 也是用 Session做登录的
就实现登录这个效果
如果继续丢失 那就打电话给江苏管网络的问问。。。唉
我也很不喜欢session --------------------编程问答-------------------- 1、配置文件中processModel标签的memoryLimit属性
  2、Global.asax或者Web.config文件被更改
  3、Bin文件夹中的Web程序(DLL)被修改
  4、杀毒软件扫描了一些.config文件。 --------------------编程问答-------------------- 谢谢19楼,学到很多
--------------------编程问答-------------------- 不太可能,Session是服务器上产生保存的,
是不是在同一时间,不同的地方? --------------------编程问答-------------------- 首先确定有人跟新你的服务器,再看看他们的网络是不是稳定,有时候客户出问题了为了引起你的注意故意夸大其词,这个得确实考证了再解决 --------------------编程问答-------------------- 嘿嘿 开句玩笑  运气不好 --------------------编程问答-------------------- 受教了! --------------------编程问答-------------------- 看不懂 ···学习··· --------------------编程问答-------------------- 我觉得是dns的关系,
我遇到过框架一个网站时,session丢失现象,后来查了相关资料,说的只有ie存在这个现象,因为它有个什么标准.意思就是访问的目标页上浏览器上的地址不同就会丢失session,
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,