微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在应用程序运行期间,会话空闲超时值的更改是否可以立即生效?

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

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 使用 appsettings.json 中定义的值。为了测试,我将应用程序发布到 IIS,然后重新启动了服务器。认值设置为 15(分钟)。它工作正常。但是,之后,无论更改任何值,它仍将使用认值(15),除非服务器重新启动。

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

解决方法

首先 IOptions<SessionOptions>SessionMiddleware 的单例中间件消费一次。该选项也是单例。因此,您只需要获取该选项并更新值即可。

但是这里的重点是什么时候更新它?如您所愿,就像您保存配置文件时一样。 Asp.net core 支持监视文件更改的功能。更改将通过 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);         
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。