Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 579|回复: 0

Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-12 09:27:37 | 显示全部楼层 |阅读模式

    1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失。

    <sessionState mode=”InProc” cookieless=”false” timeout=”20” />

    注意:使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。
    这些重新启动通常会在下面的情况中发生:
    1、配置文件中processModel标签的memoryLimit属性
    2、Global.asax或者Web.config文件被更改
    3、Bin文件夹中的Web程序(DLL)被修改
    4、杀毒软件扫描了一些.config文件。

    2. StateServer模式:保存session到独立windows进程,要使用这种方法,需要打开aspnet_state.exe服务,通过此方法,我们可以将session保存到其它服务器,这样可以实现多台服务器的session共享,且会话状态数据比较稳定,除非电脑重启或者StateService服务崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42626" cookieless="false" timeout="20" />

    注意:
      1. StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。
        
      2. 在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
        如:
        [Serializable]
        public class MyClass
        {
          ......
        }

    3. SQLServer模式:保存session到SQL Server数据库,需要指定SQLServer服务器,这种方法因为要读写数据库,性能最低。优点是这种方法最稳定,即使服务器重启了,会话数据也不会丢失。

    <sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />

    注意:首先要创建用于保存Session数据的数据库,以命令行的形式用aspnet_regsql.exe来完成,具体命令为:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd -sstype c -d sessiondb -E
    该命令是以windows验证方式,添加了sessiondb数据库保存session数据。

     

     

    在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。

    ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:

    找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:

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

    这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。关闭当前的IE,打开一个新IE,重新访问刚才的Web应用程序,就会看到类似下面的样子:其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的Session ID。注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。

    sessionState节点的语法是这样的:

    <sessionState mode="Off|InProc|StateServer|SQLServer"
    cookieless="true|false"
    timeout="number of minutes"
    stateConnectionString="tcpip=server:port"
    sqlConnectionString="sql connection string"
    stateNetworkTimeout="number of seconds"
    />
    必须有的属性是:
    mode 设置将Session信息存储到哪里
    Off 设置为不使用Session功能
    InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。
    StateServer 设置为将Session存储在独立的状态服务中。
    SQLServer 设置将Session存储在SQL Server中。
    cookieless 设置客户端的Session信息存储到哪里
    ture 使用Cookieless模式
    false 使用Cookie模式,这是默认值。
    timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟
    stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。
    sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。
    stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

    文章引用来源:
    http://mybloggers.blog.163.com/blog/static/100386509200951904716855/
    http://www.51zixuewang.com/article/xingyejishu/jiaochengtianxia/2016/137183.html
    http://blog.sina.com.cn/s/blog_531a52b50100bovg.html
    http://www.cnblogs.com/webapi/p/5726763.html

    版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
    本文标题:Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)
    本文链接:http://www.cnblogs.com/sochishun/p/6952602.html
    本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
    发表日期:2017年6月6日

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 07:11 , Processed in 0.057996 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表