Тайм-аут сеанса не уменьшается в поставщике состояний сеансов кэширования Azure Redis
Масштабирование веб-приложения с использованием нескольких экземпляров - одно из самых больших преимуществ Azure Cloud. Чтобы обеспечить поддержку нескольких виртуальных машин для нашего облачного приложения для веб-ролей, мы внедряем кэш 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");
}
Я был бы признателен, если бы мне сообщили, что нужно сделать, чтобы получить тайм-аут сеанса в режиме скольжения. С уважением,
HR Ядав
3 ответа
Спасибо, что сообщили о проблеме. Мы выпустили новую версию пакета NuGet RedisSessionStateProvider, которая исправляет вышеуказанную ошибку.
https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.5.0
РЕДАКТИРОВАТЬ: Мы нашли еще одну проблему с этим. ASP.NET не вызывает ResetItemTimeout для запросов AJAX, а другой метод состояния сеанса отвечает за уменьшение времени ожидания сеанса. Мы исправили эту ошибку и выпустили новый пакет NuGet: https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.6.5
Дайте нам знать, это решает вашу проблему или нет?
Я решил проблему скользящего истечения, включая следующие строки в global.ascx.cs
protected void Application_AcquireRequestState()
{
if (HttpContext.Current.Session != null)
{
RedisSessionStateProvider redis = new RedisSessionStateProvider();
redis.ResetItemTimeout(HttpContext.Current, HttpContext.Current.Session.SessionID);
}
}
Вы должны сбросить ключ самостоятельно (после загрузки):
bool KeyExpire(RedisKey key, DateTime? expiry, CommandFlags flags = CommandFlags.None);
bool KeyExpire(RedisKey key, TimeSpan? expiry, CommandFlags flags = CommandFlags.None);