【问题标题】:Session timeout is not sliding in Azure Redis Cache Session State ProviderAzure Redis 缓存会话状态提供程序中的会话超时不滑动
【发布时间】:2017-03-09 20:00:53
【问题描述】:

通过多个实例扩展 Web 应用程序是 azure 云的最大优势之一。为了实现对我们的 Web 角色云应用程序的多个 VM 支持,我们正在实施 Azure Redis 缓存。我们正在使用 RedisSessionStateProvider 提供程序来维护会话状态。以下是 web.config 文件中会话管理的配置设置。

<authentication mode="Forms">
  <forms loginUrl="~/Login" slidingExpiration="true" timeout="20" defaultUrl="~/Default" />
</authentication>
<sessionState timeout="20" mode="Custom" customProvider="MySessionStateStore">
  <providers>
     <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
        host = "dummy.redis.cache.windows.net" 
        port = "6380" 
        accessKey = "dummysecretkey" 
        ssl = "true" 
        throwOnError = "true" 
        retryTimeoutInMilliseconds = "5000" 
        databaseId = "0" 
        applicationName = "" 
        connectionTimeoutInMilliseconds = "5000" 
        operationTimeoutInMilliseconds = "1000" 
        connectionString = ""/>  
  </providers>

我们的问题是会话超时不会随着用户的回发而延长,假设我们的用户在上午 10:00 登录应用程序,那么他的会话数据将在绝对上午 10:20 过期。如果用户在上午 10:15 回发,则会话应在上午 10:35 到期,但这不会发生,它绝对会在上午 10:20 到期。

以下是登录按钮点击事件的代码

 protected void Button1_Click(object sender, EventArgs e)
 {
   FormsAuthentication.SetAuthCookie(TextBox1.Text.Trim(), true);
   ConnectionMultiplexer connection = ConnectionMultiplexer.Connec("dummy.redis.cache.windows.net,ssl=true,password=dummysecretkey");
   IDatabase cache = connection.GetDatabase();
   Session["UserName"] = TextBox1.Text;
   Response.Redirect("Default.aspx");
 }

如果能告诉我在滑动模式下需要做些什么来获得会话超时,我将不胜感激。 最好的问候,

H.R 亚达夫

【问题讨论】:

    标签: azure redis session-timeout azure-redis-cache


    【解决方案1】:

    感谢您报告问题。我们发布了一个新版本的 RedisSessionStateProvider NuGet 包,修复了上面报告的错误。

    https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.5.0

    编辑: 我们发现了另一个问题。 ASP.NET 不会为 AJAX 请求调用 ResetItemTimeout,而是由其他会话状态方法负责滑动会话超时。我们已经修复了这个错误并发布了一个新的 NuGet 包:https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.6.5

    让我们知道这是否解决了您的问题?

    【讨论】:

    • 非常感谢大家发布新版本。现在我对会话超时没有任何问题。每个回发都根据需要延长会话超时。我想知道你们是如何错过这个错误的,因为对于所有在 redis 缓存中维护会话状态的人来说,这将是一个非常常见的问题?
    • 它之前不存在。这是另一个修复的回归。感谢您的报告。
    • 这个问题依然存在。我正在使用 1.6.3
    • @MaDeRkAn:您能否提供您配置和使用会话状态的方式?最新的 nuget 包不应出现此问题。
    • ssl=true,throwOnError=true,retryTimeoutInMilliseconds=0,connectionTimeoutInMilliseconds=5000,operationTimeoutInMilliseconds=5000。如果我在会话中添加/更改,它只是滑动。
    【解决方案2】:

    我解决了滑动过期的问题,包括 global.ascx.cs 中的以下几行

    protected void Application_AcquireRequestState()
    {
        if (HttpContext.Current.Session != null)
        {
            RedisSessionStateProvider redis = new RedisSessionStateProvider();
            redis.ResetItemTimeout(HttpContext.Current, HttpContext.Current.Session.SessionID);
        }
    }
    

    【讨论】:

    • 能否提供您配置和使用会话状态的方式?最新的 nuget 包不应出现此问题。
    • 感谢您报告此问题。 ASP.NET 不会为 AJAX 请求调用 ResetItemTimeout,而是由其他会话状态方法负责滑动会话超时。我们已经修复了这个错误并发布了一个新的 NuGet 包:nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/…让我们知道这是否解决了您的问题?
    【解决方案3】:

    您必须自己重置密钥(加载后):

    bool KeyExpire(RedisKey key, DateTime? expiry, CommandFlags flags = CommandFlags.None);
    bool KeyExpire(RedisKey key, TimeSpan? expiry, CommandFlags flags = CommandFlags.None);
    

    【讨论】:

    • 我们是否需要在对会话变量执行的每个获取操作上重置密钥?如果是这种情况,我们将如何管理由所有用户共享的应用程序级变量和仅针对用户的会话级变量的到期?
    • 我根本不使用 sessionState。但是 AFAIK 你必须在每个 fetch 操作上重置密钥以获得“滑动”缓存机制,因为 redis 还没有提供它。
    • 那么您将如何管理用户的会话数据和应用程序级变量?
    • 取决于您的需求。如果需要持久化应用程序级变量,可以使用表存储或 Azure SQL。也许看看 Azure 的 msdn 设计模式指南:msdn.microsoft.com/en-us/library/dn600223.aspx
    • 如果我们为任何新的或现有的会话变量设置值,那么会话超时是滑动的,但如果我们只获取会话变量,那么会话在绝对时间超时。请提出可能是什么问题。
    猜你喜欢
    • 2016-04-19
    • 2015-03-10
    • 2014-12-24
    • 1970-01-01
    • 2022-01-07
    • 2013-06-11
    • 2013-05-27
    • 2014-08-06
    • 2013-07-21
    相关资源
    最近更新 更多