Azure Redis缓存会话状态提供程序中的会话超时未滑动

Azure Redis缓存会话状态提供程序中的会话超时未滑动,azure,redis,session-timeout,azure-redis-cache,Azure,Redis,Session Timeout,Azure Redis Cache,通过多个实例扩展web应用程序是azure云的最大优势之一。为了实现web角色云应用程序的多个VM支持,我们正在实施Azure Redis缓存。我们正在使用RedisessionStateProvider来维护会话状态。以下是web.config文件中会话管理的配置设置 <authentication mode="Forms"> <forms loginUrl="~/Login" slidingExpiration="true" timeout="20" defaultUr

通过多个实例扩展web应用程序是azure云的最大优势之一。为了实现web角色云应用程序的多个VM支持,我们正在实施Azure Redis缓存。我们正在使用RedisessionStateProvider来维护会话状态。以下是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>
如果您能让我知道在滑动模式下获得会话超时需要做什么,我将不胜感激。 致以最良好的祝愿


H.R Yadav

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


谢谢你报道这个问题。我们已经发布了一个新版本的RedisSessionStateProvider NuGet包,该包修复了上面报告的bug

编辑: 我们还发现了另一个问题。ASP.NET不会为AJAX请求调用ResetItemTimeout,其他会话状态方法负责滑动会话超时。我们已修复此错误,并发布了一个新的NuGet软件包:


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

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

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

我们是否需要在会话变量上执行的每个提取操作上重置键?如果是这种情况,我们将如何管理所有用户共享的应用程序级变量和只针对用户的会话级变量的过期?我根本不知道用户会话状态。但是,既然redis还没有提供“滑动”缓存机制,那么您必须在每次提取操作中重置密钥,才能获得“滑动”缓存机制。那么您将如何管理用户的会话数据和应用程序级变量?取决于您的需要。如果您需要持久化应用程序级变量,可以使用表存储或Azure SQL。请看一下Azure的msdn设计模式guid:如果我们将值设置为任何新的或现有的会话变量,则会话超时会滑动,但如果我们仅获取会话变量,则会话在绝对时间是timedout。请提出可能的问题。非常感谢各位发布新版本。现在我对会话超时没有问题。每次回发都会根据需要延长会话超时。我想知道你们怎么会错过这个bug,因为它对于所有在redis缓存中维护会话状态的人来说都是一个非常常见的问题?它以前并不存在。这是从另一个修复中恢复过来的。谢谢你的报道。这个问题仍然存在。我用的是1.6。3@MaDeRkAn:您能否提供配置和使用会话状态的方式?此问题不应发生在最新的nuget软件包中。ssl=true、throwOnError=true、RetryTimeoutInMissels=0、ConnectionTimeoutInMissels=5000、OperationTimeoutInMissels=5000。如果我在会话中添加/更改,它只是在滑动。您能提供配置和使用会话状态的方式吗?最新nuget软件包不应出现此问题。感谢您报告此问题。ASP.NET不会为AJAX请求调用ResetItemTimeout,其他会话状态方法负责滑动会话超时。我们已经修复了这个bug并发布了一个新的NuGet包:让我们知道这是否解决了您的问题?
bool KeyExpire(RedisKey key, DateTime? expiry, CommandFlags flags = CommandFlags.None);
bool KeyExpire(RedisKey key, TimeSpan? expiry, CommandFlags flags = CommandFlags.None);
protected void Application_AcquireRequestState()
{
    if (HttpContext.Current.Session != null)
    {
        RedisSessionStateProvider redis = new RedisSessionStateProvider();
        redis.ResetItemTimeout(HttpContext.Current, HttpContext.Current.Session.SessionID);
    }
}