5

通过多个实例扩展 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");
 }

如果可以让我知道在滑动模式下获得会话超时需要做什么,我将不胜感激。此致,

人力资源亚达夫

4

3 回答 3

3

感谢您报告问题。我们发布了一个新版本的 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

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

于 2015-02-05T00:58:48.490 回答
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);
    }
}
于 2015-02-12T01:58:38.877 回答
0

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

bool KeyExpire(RedisKey key, DateTime? expiry, CommandFlags flags = CommandFlags.None);
bool KeyExpire(RedisKey key, TimeSpan? expiry, CommandFlags flags = CommandFlags.None);
于 2015-02-03T08:11:45.657 回答