zoukankan      html  css  js  c++  java
  • 防止Session丢失方法整理

    Session的使用不可避免的需要注意其丢失情况,这几天在网上搜集的一些丢失Session的原因及解决办法,整理如下:

     

    1.Session超时后自动丢失

    解决:查看Session是否是超时后被清除,如需设置超时时间,可在web.config的sessionState节点中设置,此节点在下面有介绍

     

    2. 检查代码有无让Session主动丢失的代码

    解决:比如有无Session.Abandon()之类的代码

     

    3.cookie数量限制可能导致Session的丢失

    解决:Cookie的数量限制与每个浏览器有关

     

    4. 服务器内存不足导致Session丢失

    解决:可修改配置文件中processModel标签的memoryLimit属性,该属性默认为60%。

    标签位置在<system.web>中,如下所示:

    <processModel memoryLimit="60" />

    该属性指在 ASP.NET 启动新进程和重新分配现有请求前,辅助进程可以使用的最大内存大小

    亦可考虑使用第5点解决

     

    5.进程的重启导致Session丢失

    asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有DLL文件或者其他文件(Global.asax、Web.config)被动态改写,就会导致Session丢失

     

    因此引起进程重启的原因可能有:

    1. 有些杀毒软件会去扫描您的Web.Config文件,会导致丢失Session

    2. Global.asax或者Web.config文件被程序动态修改或者项目bin文件夹中的Web程序(DLL)被动态修改

     

    解决:

    (1)检查杀毒软件是否在扫描你的Web.config文件,导致Session丢失,如果是可设置杀毒软件屏蔽扫描Web.Config文件

    (2)检查自己的程序,避免有动态修改Global.asax、Web.config文件的地方

    (3) 刷新页面的时候,跟踪bin中某个文件的修改时间,确定是不是某个DLL被修改而导致Session丢失

    (4)更改Session的存储位置(session默认是存放在web进程里的)

     

    sessionState节点:

    位置:<system.web>节点中

    <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="60"/>

     

    属性mode有3种取值:InProc、StateServer、SQLServer(大小写敏感)。

    默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重启,所以造成了存储在该进程内的Session丢失。

    而StateServer、SQLServer这两种都是将Session存储到进程外的,所以当aspnet_wp.exe或w3wp.exe重启的时候,不会影响到Session

    StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动

    这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者Asp.Net StateService坏掉,否则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属性。

     

    在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。

    如:

    [Serializable]

    public class MyClass

    {

        ......

    }

     

    以上参考:http://www.cnblogs.com/nick-fbx/archive/2008/11/14/1333244.html

     

    个人整理,以备查阅,如有不对,欢迎拍砖!

     

  • 相关阅读:
    省市区选择器
    查找算法 分享1:顺序查找
    查找算法 分享2:折半(二分)查找
    编程实现对键盘输入的英文名句子进行加密。用加密方法为,当内容为英文字母时其在26字母中的其后三个字母代替该字母,若为其它字符时不变。
    查找算法 分享3:分块查找
    NSMutableDicitionary 的setValue和setObject的区别
    查找算法 分享4:哈希查找
    玩转博客园的5个小技巧
    WCF读书笔记安全:基础知识(身份验证、授权、传输安全)
    北京的房价
  • 原文地址:https://www.cnblogs.com/adayywq/p/3885227.html
Copyright © 2011-2022 走看看