通过多个实例扩展Web应用程序是azure cloud的最大优势之一。为了实现对我们的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 Yadav
答案 0 :(得分:3)
感谢您报告此问题。我们发布了一个新版本的RedisSessionStateProvider NuGet包,修复了上述报告的错误。
https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.5.0
编辑: 我们发现了另外一个问题。 ASP.NET不会为AJAX请求调用ResetItemTimeout,并且其他会话状态方法负责滑动会话超时。我们修复了这个bug并发布了一个新的NuGet包:https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.6.5
让我们知道这是否可以解决您的问题?
答案 1 :(得分:2)
我解决了滑动过期的问题,包括global.asax.cs中的以下几行
protected void Application_AcquireRequestState()
{
if (HttpContext.Current.Session != null)
{
RedisSessionStateProvider redis = new RedisSessionStateProvider();
redis.ResetItemTimeout(HttpContext.Current, HttpContext.Current.Session.SessionID);
}
}
答案 2 :(得分:0)
您必须自己重置密钥(加载后):
bool KeyExpire(RedisKey key, DateTime? expiry, CommandFlags flags = CommandFlags.None);
bool KeyExpire(RedisKey key, TimeSpan? expiry, CommandFlags flags = CommandFlags.None);