C# 为什么DefaultHttpContext会话配置在(~20分钟)后失效?
我使用的用例是在登录窗口中选择数据库,用户可以选择访问哪个数据库(例如PROD和TEST)。我接受他们的选择并覆盖C# 为什么DefaultHttpContext会话配置在(~20分钟)后失效?,c#,asp.net-core,session-cookies,C#,Asp.net Core,Session Cookies,我使用的用例是在登录窗口中选择数据库,用户可以选择访问哪个数据库(例如PROD和TEST)。我接受他们的选择并覆盖ApplicationDbContext中的onconfig()(可能是也可能不是最好的方式) 只要用户处于活动状态,会话设置就可以正常工作,但根据HttpSession超时(非预期)和会话Cookie超时(预期),我会遇到(2)个不同的错误 为什么以及如何使DefaultHttpContext.Session不因每个错误而放弃其“配置”#2? 如果我将空闲超时设置为5分钟,我会得到
ApplicationDbContext
中的onconfig()
(可能是也可能不是最好的方式)
只要用户处于活动状态,会话设置就可以正常工作,但根据HttpSession超时(非预期)和会话Cookie超时(预期),我会遇到(2)个不同的错误
为什么以及如何使DefaultHttpContext.Session不因每个错误而放弃其“配置”#2?
UseSession()
空闲超时或将其设置得更大(比如60分钟),我会在一段不活动时间后遇到以下主要错误:ConfigureServices(..)
// services.AddSession();
services.AddSession(options =>
{
options.Cookie.Name = "TestSession";
//options.Cookie.Expiration = TimeSpan.FromMinutes(245); //invalid
//options.IdleTimeout = TimeSpan.FromMinutes(245);
//options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
------------------------------
Configure(...)
app.UseSession(); //before UseEndpoints() and after UserRouting()
--在登录时为要在ApplicationDBConnect覆盖中使用的数据源连接字符串设置会话
AccountController:
[HttpPost]
Login(...)
IConfigurationSection connectionString = _configuration.GetSection("ConnectionStrings").GetChildren().Where(a => a.Key == database).SingleOrDefault();
HttpContext.Session.SetString("ConnectionName", connectionString.Key);
HttpContext.Session.SetString("ConnectionString", connectionString.Value);
--这工作正常,直到我在大约20分钟后出现会话未配置错误
ApplicationDbContext:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
string ConnectionString = _httpContextAccessor.HttpContext.Session.GetString("ConnectionString");
optionsBuilder.UseSqlServer(ConnectionString);
}
--我甚至尝试在IIS中使用以下多种不同设置设置:
<system.web>
<sessionState cookieless="AutoDetect" cookieName="TestSession" timeout="1440" />
</system.web>
应用程序池空闲超时有一个IIS设置,默认值为20分钟。尝试将其设置为零:IIS->应用程序池,选择您的池->高级设置,搜索“空闲超时(分钟)”。@nilsK它已经是0了,感谢您发布此提示!
<system.web>
<sessionState cookieless="AutoDetect" cookieName="TestSession" timeout="1440" />
</system.web>
CookieOptions option = new CookieOptions();
option.Expires = DateTime.Now.AddMinutes(1440); //24hours
HttpContext.Response.Cookies.Append("ConnectionName", connectionString.Key, option);
HttpContext.Response.Cookies.Append("ConnectionString", connectionString.Value, option);