ASP.NET MVC 5中IIS Web Garden下Session ID变更的解决方法咨询
解决IIS Web Garden中Session ID频繁变更的方案
当IIS启用Web Garden(多工作进程模式)时,每个工作进程独立维护自己的Session存储,请求被分配到不同进程就会导致Session ID变更。要解决这个问题,有以下几种可行方案:
1. 使用外部共享Session存储
放弃默认的InProc进程内Session模式,改用全局共享的存储方案,让所有工作进程共用同一Session数据源:
- SQL Server存储:将Session数据持久化到SQL Server,所有进程从数据库读取Session。在
web.config中配置:
<sessionState mode="SQLServer" sqlConnectionString="Data Source=你的SQL服务器地址;Integrated Security=SSPI;" />
- Redis存储:通过自定义Session提供器将数据存在Redis,适合高并发场景,同样在
web.config中配置mode="Custom"并指定对应的提供器类。 - StateServer存储:使用IIS自带的状态服务(ASP.NET State Service),这是一个独立的进程服务,所有工作进程连接到该服务获取Session。配置示例:
<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" />
2. 开启进程亲和性(Affinity)
在IIS应用池的高级设置中,找到进程模型下的亲和性选项,设置为开启。这样同一个客户端的所有请求会被固定分配到同一个工作进程,避免跨进程导致的Session ID变更。
注意:这个方案可能造成工作进程负载不均,因为客户端请求会固定绑定到某个进程,适合负载波动不大的场景。
3. 调整业务依赖逻辑
如果业务允许,尽量减少对Session ID的强依赖,改用Cookie、Token(如JWT)等客户端存储的标识方式,从根源上规避进程间Session不一致的问题。
内容的提问来源于stack exchange,提问作者Ahmed Elbatrawy
相关产品推荐
相关产品推荐

