在应用程序运行期间更改会话的空闲超时值能否立即生效?
Can changes for session's idle timeout value, during application runtime, take effect immediately?
这可能是一个非常不必要的实现,但请多多包涵。
Startup.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 中 Session 的 IdleTimeout 使用 [ 中定义的值=39=]。为了进行测试,我将应用程序发布到 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);
});
这可能是一个非常不必要的实现,但请多多包涵。
Startup.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 中 Session 的 IdleTimeout 使用 [ 中定义的值=39=]。为了进行测试,我将应用程序发布到 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);
});