C# 为什么DefaultHttpContext会话配置在(~20分钟)后失效?

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分钟,我会得到

我使用的用例是在登录窗口中选择数据库,用户可以选择访问哪个数据库(例如PROD和TEST)。我接受他们的选择并覆盖
ApplicationDbContext
中的
onconfig()
(可能是也可能不是最好的方式)

只要用户处于活动状态,会话设置就可以正常工作,但根据HttpSession超时(非预期)和会话Cookie超时(预期),我会遇到(2)个不同的错误

为什么以及如何使DefaultHttpContext.Session不因每个错误而放弃其“配置”#2?

  • 如果我将空闲超时设置为5分钟,我会得到这个错误,这是预期的,并且由于cookie被删除(字符串为null),所以是正常的
  • ArgumentNullException:值不能为null。(参数“connectionString”)

  • 如果我没有设置一个
    UseSession()
    空闲超时或将其设置得更大(比如60分钟),我会在一段不活动时间后遇到以下主要错误:
  • 无效操作异常:尚未为此应用程序或请求配置会话。

    --

    --Startup.cs

    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);