部署至IIS 8.5后Asp.Net Core 5 MVC的TempData与Session失效问题
解决Asp.Net Core 5 MVC部署IIS 8.5后TempData/Session失效问题
一、先检查应用代码配置
Asp.Net Core的Session和TempData依赖自身中间件,和IIS的Session State不是一回事,先确认代码配置是否到位:
- 确保在
Startup.cs(Core 5项目一般用Startup)里正确注册Session服务:services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 按需设置超时时间 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; // 标记为必要Cookie,避免被用户禁用 }); - 把Session中间件加到请求管道里,注意顺序必须在
UseRouting之后、UseAuthorization之前:app.UseSession(); - 如果不想依赖Session存储TempData,也可以改用Cookie存储,直接绕开Session问题:
services.AddControllersWithViews() .AddTempDataCookieOptions(options => { options.Cookie.Name = ".YourApp.TempData"; options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; });
二、IIS 8.5配置要注意这几点
就算你开启了IIS的Session State,Core应用的Session是独立运行的,这些设置必须检查:
- 应用程序池的
.NET CLR版本必须设为无托管代码:- 打开IIS管理器,找到目标应用程序池,右键选择
高级设置 - 找到
.NET CLR版本选项,选择无托管代码(Core是自托管架构,不需要IIS的托管运行时)
- 打开IIS管理器,找到目标应用程序池,右键选择
- 检查应用程序池标识的权限:
如果用自定义账户作为应用池标识,要确保该账户拥有网站临时目录(比如C:\Windows\Temp或站点App_Data文件夹)的读写权限,否则Session文件无法正常存储 - 站点Cookie设置不能禁用Session Cookie:
进入站点的HTTP响应头,确认没有添加限制Cookie的自定义头;另外在IIS的Session State设置中,Cookie设置的模式要选Cookie,不要选无Cookie - 检查URL重写规则:
如果站点配置了URL重写规则,要确保规则没有修改或删除Session Cookie
三、额外排查步骤
- 确认网站目录权限:应用程序池标识需要拥有网站根目录(尤其是
wwwroot和临时目录)的读写权限 - 查看Windows事件日志:打开事件查看器的
应用程序日志,查找Asp.Net Core相关的错误信息,比如Session初始化失败的异常 - 测试Session一致性:在控制器中输出Session的Id,对比重定向前后的Id是否一致,如果Id不同,说明Session没有被正确保留
内容的提问来源于stack exchange,提问作者Domenico Dri Hernández
相关产品推荐
相关产品推荐

