由于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丢失。  
   
   哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:  
   1、配置文件中processModel标签的memoryLimit属性  
   2、Global.asax或者Web.config文件被更改  
   3、Bin文件夹中的Web程序(DLL)被修改  
   4、杀毒软件扫描了一些.config文件。  
   更多的信息请参考PRB:    Session    variables    are    lost    intermittently    in    ASP.NET    applications  
   
   
   解决办法:  
   
   前面说到的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  
   {  
           ......  
   }  
   具体的序列化相关的知识请参这里。   
   
ASP.NET 使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer 模式。

session是工作在你的应用程序进程中的。asp.net进程、iis往往会在20分钟之后重启相关的应用程序,缓冲池满了(例如100个之后)也会重启,各种进程保护措施都会随时重新启动,因此InProc方式丢失session是很正常的事。csdn上明确告诉了这种模式只能保存“易失的、暂时的 ”变量,这是cache没有之前的一种解决方案。而长期保持的数据就要保存在外部数据源中。状态服务器就是一种进程外的数据源。

StateServer 模式的实质是,把Session 存放在一个单独的进程里,此进程独立于 aspnet_wp.exe 或 w3wp.exe 。启用此服务后,在“任务管理器”中可以看到一个名为 aspnet_state.exe 的进程,下面开始说明一下设置的具体步骤:

1、 修改注册表(关键步骤,如下图)

运行 regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state /Parameters 节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)→ 设置 Port (端口号)

注意事项:

a)、若ASP.NET State Service 正在运行,修改注册表内容后,则需要重新启动该服务

b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424 是默认的端口

c)、AllowRemoteConnection 的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的ASP.NET State Service,即把 Session 存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString 为“tcpip=localhost: 42424”与“tcpip=127.0.0.1:42424”的情况,方可使用ASP.NET State Service

2、 开启 ASP.NET State Service

右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 双击“ASP.NET State Service” → 启动(可设为“自动”)

说明:只要安装了 .Net Framework ,都拥有此服务。

3、 更改 Web.config

打开 Web.config → 找到 <sessionState> 节点内容

<sessionState

mode=”InProc”

stateConnectionString=”tcpip=127.0.0.1:42424″

sqlConnectionString=”data source=127.0.0.1;Trusted_Connection=yes”

cookieless=”false”

timeout=”20″ />

→ 将其改为以下内容

<sessionState mode=”StateServer” stateConnectionString=”tcpip=192.168.0.2:42424″ timeout=”20″ />

注意事项:
1、timeout=”20″为Session 20分钟超时

2、IP 地址(可以是远程计算机 IP、计算机名称、域名)与端口号,端口号需与ASP.NET State Service 的服务端口一致

分布式保存Session 和 StateServer 解决 Session过期相关推荐

  1. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  2. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  3. 在分布式环境中解决session共享问题

    一.什么是session session在计算机中,尤其是在网络应用中,称为"会话控制".Session对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的web页面 ...

  4. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  5. iis php session丢失,Session丢失的解决办法小结

    原标题:Session丢失的解决办法小结 对于ASP.PHP网站且使用我司虚拟主机的用户,如果超时太短,可提交工单申请更换应用程序池(该应用程序池设置为只按时间回收,回收时间30分钟). 如果更换程序 ...

  6. razor 怎样使用session变量_Nginx负载均衡解决session一致性问题

    [145] 前言: http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后 ...

  7. PHP 分布式集群中session共享问题以及session有效期的设置

    一.Session的原理 以下以默认情况举例: session_start();之后,会生成一个唯一的session_id,每一个用户对应唯一一个session_id,每一个session_id对应服 ...

  8. PHP 解决session 死锁

    今天在开发碰到个棘手的问题 . 当异步请求后台处理一个大数据量操作时  请求其他控制器都没返回信息了..起初以为是Ext 框架设置了ajax同步造成的. 后来发现时session 死锁造成其他控制器在 ...

  9. Spring Boot 2.X + Shiro 优雅解决 session 跨域问题

    一.跨域问题 web 开发中跨域问题是一个老生常谈的问题,根本原因是浏览器基于安全原因考虑对非同源的脚本操作和 ajax 访问进行了限制,介绍的文章网上有很多,这里不做赘述. 二.解决方案 跨域问题有 ...

  10. php小程序session取不到,微信小程序实现Session功能及无法获取session问题的解决方法...

    因为小程序原生不支持Cookie,因此也不支持Session. 网上找到的的一些方法有缺陷,而且很多累赘,估计没有实际测试过,在此直接给出实测可用的代码. 大概思路就是借助小程序本地储存+网络请求的h ...

最新文章

  1. Facebook创建新机器学习系统,用于对视频中的人脸进行“去识别化”
  2. Linux 用qmake快速生成makefile
  3. 期末复习、化学反应工程科目(第八、九章)
  4. android按钮点击变化,Android实现按钮点击效果(第一次点击变色,第二次恢复)...
  5. 【重大更新】DevExpress v17.2新版亮点—Bootstrap篇(二)
  6. 存储过程实现可扩展灵活接口
  7. java classpath设置_Java CLASSPATH设置
  8. 給服务器增加swap空间缓解内存压力
  9. 跟着编程之美学算法——最长递增子序列(转)
  10. 由浅至深 谈谈.NET混淆原理(三)-- 流程混淆
  11. Winform—C#读写config配置文件
  12. EasyUI系列学习(一)-入门
  13. ubuntu下非常好用的PDF阅读器
  14. STM32固件库最新下载方法 2021/6
  15. 一个数据分析师的职业规划:人生本来就应该提前做好准备
  16. 数字化转型的必要性和意义
  17. c语言.jpg图片转成数组_如何把pdf图片转成jpg?快看高手私藏实用的技巧
  18. JAVA设计模式总结之六大设计原则(一)
  19. Eclipse中怎样将java项目转化为web项目?
  20. SEO-搜索引擎优化

热门文章

  1. SPSS问卷中的人口学变量是否要用?以及如何选用?【SPSS 065期】
  2. php检查数组下标是否,php检查数组下标是否存在
  3. arcgis engine设置数据源路径_不懂ArcGIS,你前期分析用什么做的?
  4. php 时间 拼接,PHP关于时间的时段的重合、 整合的方法
  5. yolo-v5连接手机摄像头实时检测的步骤
  6. python 函数修饰符作用是什么_python函数修饰符@的使用
  7. 微信朋友圈的测试用例
  8. 1462 通往奥格瑞玛的道路
  9. LINUX最好用查看端口占用并杀死(kill)的方式
  10. Java千百问_05面向对象(008)_java中覆盖是什么