Redis — переход из состояния сеанса IIS

#c# #asp.net #redis #stackexchange.redis

#c# #asp.net #redis #stackexchange.redis

Вопрос:

Я пытаюсь понять, как реализовать redis, заменив все значения состояния сеанса IIS кэшем redis. У меня redis работает с использованием образа docker. Я использую веб-приложение C # .Net Forms. Я включил StackExchange.Повторно откройте пакет nuget и настройте его до сих пор.

 public class Redis
{
    private static readonly Lazy<ConnectionMultiplexer> LazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {

        var redisConnectionString = ConfigurationManager.AppSettings["RedisConnectionString"];
        var options = ConfigurationOptions.Parse(redisConnectionString);
        options.AbortOnConnectFail = false;

        return ConnectionMultiplexer.Connect(options);
    });

    public static ConnectionMultiplexer Connection => LazyConnection.Value;
}
  

Но я не понимаю, как сохранить пары значений ключа сеанса пользовательского контекста. Под этим я подразумеваю, что когда я сохраняю ключ для пользователя, скажем «userId», может ли ключ быть просто «userId»? или мне нужно добавить к нему уникальный пользовательский идентификатор контекста. Я не могу найти ничего о том, как redis будет работать на основе разных пользователей. Как он узнает контекст пользователя и, следовательно, как получить правильный ключ?

Все, что я читаю, это то, что это хэш-таблица, в которой хранятся значения, что подходит для одного идентификатора пользователя, но у меня будет много пользователей с идентификатором пользователя?

Если кто-нибудь может помочь мне разобраться в этом, это было бы здорово, спасибо вам

Комментарии:

1. Если вы делаете это вручную непосредственно в Redis, вам нужно каким-то образом управлять идентификатором сеанса и использовать его в ключах. В противном случае вы понятия не имеете, что есть что, и будете перезаписывать вещи. Но если вы используете уже предоставленный поставщик состояния сеанса для Redis, тогда просто используйте ASP.NET состояние и фреймворк все обработают за вас

2. Я использую StackExchanage. Пакет nuget Redis, так будет ли это творить чудеса?

3. Нет, это просто обеспечит прямой доступ к Redis. Microsoft.Web.RedisSessionStateProvider должен быть тем, что вы хотите

4. Хорошо, итак, единственная проблема с learn.microsoft.com/en-us/azure/azure-cache-for-redis / … в нем говорится, что он не будет масштабироваться, если нам это нужно. Итак, предположим, мне нужно создать уникальный ключ, если мы хотим масштабироваться

5. Любому встроенному поставщику состояния необходим общий ключ для работы в горизонтально масштабируемой среде. У них должен быть доступ к данным, и они зашифрованы на основе общего ключа.

Ответ №1:

Хорошо, итак, после просмотра следующей ссылки я смог заставить все это работать

https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-aspnet-session-state-provider

  1. Я установил образ redis docker следующим образом в командной строке, заменив ваш your_long_password_here, вы также можете просто указать порт 6379:6379, но я хотел посмотреть, что произойдет, если я использую другой порт. Пароль важен, поскольку в противном случае он будет выполняться в защищенном режиме, что означает, что могут выполняться только вызовы localhost (loopback), что помогает защитить его больше, поскольку до версии 3.2 этого не было!
 docker run -p 8055:6379 --name redis --restart=always -d redis –-requirepass <your_long_password_here>
  
  1. Запустите эту команду, чтобы убедиться, что она была запущена, вы должны увидеть, что порт имеет указанные вами значения
 docker container ls
  
  1. Затем в вашем проекте .net установите следующий пакет nuget из консоли nuget package manager или воспользуйтесь менеджером пакетов с графическим интерфейсом. Вам нужно будет использовать .net 4.6.2 для текущей версии.
 Install-Package Microsoft.Web.RedisSessionStateProvider
  
  1. После установки закомментируйте или удалите эту строку в вашем Web.config
 <sessionState mode="InProc" timeout="60" />
  
  1. Затем обновите или измените нового поставщика, который пакет nuget добавит в ваш Web.config. Это должно быть внутри системы.веб- тег. Обратите внимание, что я использовал строку подключения, поскольку она пока не будет размещена в azure, но для ее настройки существует множество дополнительных параметров, вводящих в заблуждение.
 <sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
  <add name="MySessionStateStore"
       type="Microsoft.Web.Redis.RedisSessionStateProvider"
       connectionString="localhost:8055,password=your_long_password_here"/>
  </providers>
</sessionState>
  
  1. Вам нужно будет убедиться, что все объекты, которые вы сохраняли в сеансе iis, имеют атрибут [Serializable], поскольку в противном случае он не будет работать и выдаст ошибку.

Теперь вы должны увидеть, что можете беспрепятственно запускать свой веб-сайт, и теперь вы будете использовать кэш redis, а не состояние сеанса.