分布式保存Session 和 StateServer 解决 Session过期

ASP.NET Session配置核心原理与高可用实战指南 Session是Web应用中实现用户状态管理的基础机制,其本质并非简单数据存储,而是一套基于SessionID的信任契约,依赖加密签名、密钥同步与序列化安全来保障跨请求一致性。理解SessionID的防伪机制、Cookie的大小与数量限制、MachineKey在集群中的统一作用,是解决会话丢失、跨服务器失效等高频问题的前提。在分布式场景下,StateServer和SQLServer模式虽可脱离InProc,但需严控网络连通性、超时配置、SQL Agent清理任务及序列化风险。本文聚焦于.NET平台Sessi 阅读详情

由于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 的服务端口一致

ASP.NET Session并发阻塞与无状态替代方案实战 Session是ASP.NET中用于维持用户会话状态的基础机制,其底层依赖标记接口、HttpModule管线和存储锁机制实现。然而,默认的InProc模式引发严重并发阻塞、内存泄漏与水平扩展瓶颈;StateServer/SQLServer则带来序列化开销与网络延迟。现代Web架构强调无状态设计,JWT令牌、Redis分布式缓存、MemoryCache双写等替代路径,可在保障登录态、购物车、临时数据等核心场景的同时,显著提升吞吐量与云原生兼容性。本文聚焦Session的锁等待实证、七宗罪归因及渐进式迁移策略, 阅读详情

相关推荐

视觉开发板—K210自学笔记(三)--点亮LED

K210点亮LED灯

adamsecond 3412

使用 StateServer 保存 Session 解决 Session过期

使用 StateServer 保存 SessionPost by roydux, 2008-4-23, Views:89 正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。 这次到优快云上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软...

weixin_30709061的博客 192

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9642

《SpringSecurity in Action》五:SpringSession基于redis实现分布式session设置session超时时间

文章目录1 概述2 原因3 测试 1 概述 在基于redis实现分布式session开发时,发现设置了session超时后怎么也不生效,我分别进行了两处设置: server: servlet: session: timeout: 300 # 5分钟 spring: session: timeout: 300 分别进行了这两处配置后,发现我们session并没有正确的设置为5分钟,还是默认的30分钟。 2 原因 当使用redis作为共享session时,会涉及到以下几个

shangcunshanfu的博客 4015

MOOS-ivp 实验三 MOOS简介(3)

MOOS-ivp 实验三 MOOS简介(3) 继上一篇文章继续对实验进行记录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录MOOS-ivp 实验三 MOOS简介(3)六、A Simple Example with pXRelay1.pXRelay基本使用2.pXRelay简单例子3.pXRelay实验七、First Experiments in Modifying MOOS App Code1.下载一个MOOS模板文件2.打开MOOS模板文件总结 六、A Simple E

weixin_44151170的博客 2534

从SSTS到CTS:解码汽车电子架构中的需求与实现规范

本文深入解析汽车电子架构中SSTS(子系统功能规范)与CTS(零部件技术规范)的转换过程,揭示从抽象需求到物理实现的关键步骤。通过实际案例说明如何将SSTS的功能逻辑、接口定义和性能指标转化为具体的CTS实施方案,并分享多供应商协同与测试验证的最佳实践,帮助开发者高效完成汽车电子系统开发。

weixin_29201859的博客 499

使用 sessionState mode="StateServer",在开启了状态服务后,还是报错:无法向会话状态服务器发出会话状态请求。...

  最近项目采用了“StateServer”模式来保存session,即配置:<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="6000" />   在 ASP.NET State Service(ASP.NET状态服务)...

weixin_30512043的博客 923

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

Session 共享(StateServer模式)(原创)

Session 共享要注意两点: 1、必须在同一个域名下 2、StateServer模式是把session保存在同一台服务器上的进程:aspnet_state.exe里面,当然也可以保存在memcache和数据库里,这个下一节再讲。   web.config设置: &lt;machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314...

weixin_34150224的博客 206

Qt实现思维导图功能1『核心树』

利用Qt的QGraphicsView框架实现思维导图功能 百度网盘体验地址: 链接:https://pan.baidu.com/s/15x9F48agCDOQbsyH3VwVXA 提取码:8svh 注:UI风格参考博主:前行中的小猪,博文地址:https://blog.csdn.net/GoForwardToStep/article/details/124692790?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_u

浮生流年的博客 6163

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2926

StateServer 解决 Session过期和分布式保存Session

使用 StateServer 保存 SessionPost by roydux, 2008-4-23, Views:89 正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。          这次到优快云上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站

netbug2009的专栏 850

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

分布式之Session共享

在之前的博文中我们介绍了通过Nginx+IIS实现网站的负载均衡,那么问题来了,多个站点之前由于负载均衡用户会在各个站点之间切换,那么这种情况下如果用到了Session如何实现多个站点Session共享就是个问题了。

Leaderxin的博客 703

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

什么是Session分布式共享

在了解session分布式共享之前先来了解Session、Redis和Nginx的相关知识。 一、Session相关知识 1、Session 介绍 Session在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会产生一个Session,同时服务器会分配一个SessionId给用户的浏览器。我们可以用Fiddler查看cookies中,会看到有一个SessionI...

weixin_33889665的博客 117

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Asp.Net集群中Session共享

今天遇到了这个问题,于是研究了一下。要解决这个问题,首先就要明白一些Session的机理。Session在服务器是以散列表形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Session。那么服务器是怎么区分不同用户的Session?又是怎么将不同用户的Session与不同的用户绑定的呢?下面我们来研究一下,以下纯属我个人的理解,如有错误请指证。 Sess...

diaohuyi6830的博客 268

分布式中使用Redis实现Session共享(二)

上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理。在阅读之前假设你已经会使用nginx+iis实现负载均衡搭建负载均衡站点了,这里我们会搭建两个站点来验证redis实现的session是否能共享。 阅读目录 Session实现原理session共享实现方案问题拓展总结 回

难道我还不够帅的专栏 772

Redis--分布式中实现Session共享(二)

上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理。在阅读之前假设你已经会使用nginx+iis实现负载均衡搭建负载均衡站点了,这里我们会搭建两个站点来验证redis实现的session是否能共享。 阅读目录 Session实现原理 session共享实现方案 问题拓展 总结...

iteye_8039的博客 174

Redis--分布式中实现Session终结篇

上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那么能不能实现无侵入式的分布式Session共享方案呢?mode="InProc"这是web.config里面使用iis进程保存Session的配置,不知你注意过没,mode除了InProc,SQLServer,StateServer这几个常...

iteye_8039的博客 130

Session 详解

摘要:本文探讨了Web开发中的会话(Session)机制实现。首先通过商店会员活动案例引出会话概念,解释了HTTP无状态协议下需要会话管理的原因。详细分析了不同Web平台对Session的实现方式,重点介绍了ASP.NET中Session的配置选项(mode、cookieless等)和常见Session丢失原因。针对Session共享和负载均衡场景提出了解决方案,并指出传统Session的并发缺点。最后建议可考虑替代方案如cookie加密、Redis等存储登录状态。文章还包含了Session序列化问题和简单

FeJerry的专栏 75

分布式中使用 Redis 实现 Session 共享(下)

http://blog.jobbole.com/91877/ 原文出处: 焰尾迭   欢迎分享原创到伯乐头条 上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那么能不能实现无侵入式的分布式Session共享方案呢?mode=”InProc”这是web.config里面使

onlyForCloud的专栏 1460

分布式中Redis实现Session终结篇

  上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那么能不能实现无侵入式的分布式Session共享方案呢?mode="InProc"这是web.config里面使用iis进程保存Session的配置,不知你注意过没,mode除了InProc,SQLServer,StateServer这几...

weixin_34351321的博客 237

nginx+redis实现session共享 .NET分布式架构

上两篇文件介绍了如何安装和封装redis 本篇主要是记录下怎么实现 nginx+redis实现session共享 目前session问题点 又爱又恨的Session 刚接触程序开发的人一定爱死Session了,因为Session让Http从无状态变成有状态了,页面之间传值、用户相关信息、一些不变的数据、甚至于查出来的DataTable也可以放进去,取值的时候只需要Ses...

weixin_30746117的博客 255
上一篇: Visual Studio 2008操作技巧
下一篇: Web前端-HTTP Cache-control
High_Mount
博客等级 码龄20年 49粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值