Тайм-аут сеанса не уменьшается в поставщике состояний сеансов кэширования 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);
Другие вопросы по тегам