在应用程序运行时,对会话空闲超时值的更改是否可以立即生效?



这可能是一个非常不必要的实现,但请耐心等待。

启动.cs

services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(Configuration.GetValue<double>("Custom:SessionTimeout"));
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});

appsettings.json

{
...,
"Custom": {
"CookieTimeout": 15,
"LockTimeout": 15,
"SessionTimeout": 15
}
}

我的意图是允许修改会话超时的值。如上所述,Startup.cs中的会话的IdleTimeout使用appsettings.json中定义的值。为了进行测试,我将应用程序发布到IIS,然后重新启动服务器。默认值设置为15(分钟(。它工作正常。但是,之后,无论更改了什么值,它都将仍然使用默认值(15(,除非重新启动服务器。

我的问题是,是否可以在不重新启动服务器的情况下立即使更改生效?

首先IOptions<SessionOptions>SessionMiddleware的单例中间件消耗一次。这个选项也是单例的。因此,您只需要获得这些选项并更新这些值。

然而,这里的重点是什么时候更新它?当您保存配置文件时,它看起来就像您想要的那样。Asp.net核心支持一个监视文件更改的功能。更改将通过IChangeToken(对于每个获得的令牌只能使用一次(进行通知。处理完更改后,您需要获得另一个更改令牌来观察更改。然而,您不必手动执行该逻辑,因为我们有静态方法ChangeToken.OnChange,它可以方便地配置更改处理程序。它接受一个工厂来获取IChangeToken和一个处理程序(在发生一些更改后调用(。IConfiguration公开了一个名为GetReloadToken的方法来获得IChangeToken,因此我们可以使用它。

这是代码:

//inside Startup.ConfigureServices
services.AddSession(options => { 
options.IdleTimeout = TimeSpan.FromMinutes(Configuration.GetValue<double>("Custom:SessionTimeout"));
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;               
//update options on changes made to the configuration file
ChangeToken.OnChange(
() => Configuration.GetReloadToken(),
so => {
so.IdleTimeout = TimeSpan.FromMinutes(Configuration.GetValue<double>("Custom:SessionTimeout"));
}, options);         
});

相关内容

  • 没有找到相关文章

最新更新