升级Microsoft.Web.RedisSessionStateProvider至5.0.4后ASP.NET应用出现过多重定向问题
升级Microsoft.Web.RedisSessionStateProvider至5.0.4后ASP.NET应用出现过多重定向问题
看起来你在升级Redis会话状态提供器后碰到了重定向循环的问题,我之前维护.NET Framework 4.8项目时也遇到过类似情况,结合你的web.config配置,咱们一步步来排查解决:
一、先调整Redis会话提供器的配置兼容性
新版本的Microsoft.Web.RedisSessionStateProvider 5.x对配置参数的处理有一些变化,先修改你的会话提供器配置试试:
<sessionState mode="Custom" customProvider="RedisSessionProvider" timeout="120"> <providers> <add name="RedisSessionProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider, Microsoft.Web.RedisSessionStateProvider" connectionString="127.0.0.1:6379,ssl=false" throwOnError="true" retryTimeoutInMilliseconds="5000" /> </providers> </sessionState>
- 改用
connectionString参数代替单独的host/port/ssl:5.x版本更推荐统一的连接字符串格式,避免参数解析逻辑不一致的问题 - 加上
throwOnError="true":强制暴露Redis连接或会话操作的底层错误(旧版本默认可能隐藏这类错误,导致会话创建失败触发重定向循环)
二、检查异步会话模块的必要性
你的web.config里手动注册了SessionStateModuleAsync,但RedisSessionStateProvider 5.x本身已经内置异步会话支持,额外注册这个模块可能会和提供器产生冲突:
- 暂时注释掉
<modules>里的Session模块配置:
<!-- <remove name="Session" /> --> <!-- <add name="Session" type="Microsoft.AspNet.SessionState.SessionStateModuleAsync, Microsoft.AspNet.SessionState.SessionStateModule" preCondition="integratedMode" /> -->
- 让系统使用默认的
SessionStateModule,5.x提供器会自动处理异步会话逻辑
三、调整程序集绑定重定向(解决依赖冲突)
看你的runtime配置里,部分依赖的版本可能和RedisSessionStateProvider 5.0.4不兼容,重点更新以下两个绑定:
<dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.AspNet.SessionState.SessionStateModule" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" /> </dependentAssembly>
System.Runtime.CompilerServices.Unsafe是StackExchange.Redis(Redis提供器的核心依赖)的关键组件,5.x版本的提供器需要至少6.0版本的支持- 同步更新
Microsoft.AspNet.SessionState.SessionStateModule的绑定到2.2.0,这是和5.x提供器匹配的兼容版本
四、清理旧会话数据并重启服务
- 打开本地Redis的命令行工具(
redis-cli),执行:
FLUSHALL
- 重启你的ASP.NET应用程序池,清除本地缓存的程序集和残留会话数据
五、启用日志排查深层问题
如果以上步骤还没解决,开启Redis提供器的详细日志,定位底层错误:
- 在会话提供器配置里添加日志类:
<add name="RedisSessionProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider, Microsoft.Web.RedisSessionStateProvider" connectionString="127.0.0.1:6379,ssl=false" throwOnError="true" retryTimeoutInMilliseconds="5000" loggingClassName="Microsoft.Web.Redis.RedisSessionStateProviderLogging, Microsoft.Web.RedisSessionStateProvider" />
- 打开Windows事件查看器,在
应用程序日志里查找来自RedisSessionStateProvider的错误信息——这能帮你精准定位是连接失败、权限问题还是序列化错误导致的会话创建失败
按照这个顺序一步步试,应该能解决重定向循环的问题——大概率是配置不兼容或者依赖冲突导致会话创建失败,进而触发页面的重定向逻辑(比如未登录/会话失效跳转)形成循环。




