Redis - 从 IIS 会话状态转移

And*_*rew 4 c# asp.net redis stackexchange.redis

我试图了解如何通过用 Redis 缓存替换所有 IIS 会话状态值来实现 Redis。我让 redis 使用 docker 镜像工作。我正在使用 C# .Net Forms Web 应用程序。到目前为止,我已经包含了 StackExchange.Redis 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;
}
Run Code Online (Sandbox Code Playgroud)

但我很困惑如何存储用户上下文会话键值对。我的意思是,当我为用户存储密钥时,说“UserId”,密钥可以只是“UserId”吗?或者我是否需要在它前面添加一个唯一的用户特定上下文 ID。我找不到任何关于 redis 如何根据不同用户工作的信息。它如何知道用户的上下文以及如何获得正确的密钥?

我读到的只是它是一个存储值的哈希表,这对于单个 UserId 来说很好,但是我将拥有很多具有 UserId 的用户?

如果有人能帮助我理解这一点,那就太好了,谢谢

And*_*rew 7

好的,在查看以下链接后,我能够使其全部正常工作

\n

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

\n
    \n
  1. 我在命令行上安装了一个 redis docker 映像,如下所示,替换了your_long_password_here,您也可以只指定端口6379:6379,但我想看看如果我使用另一个端口会发生什么。密码很重要,否则它将在保护模式下运行,这意味着只能进行 localhost(loopback) 调用,这有助于更好地保护它,因为在 3.2 版本之前,情况并非如此!
  2. \n
\n
\n
docker run -p 8055:6379 --name redis --restart=always -d redis \xe2\x80\x93-requirepass <your_long_password_here>\n
Run Code Online (Sandbox Code Playgroud)\n
\n
    \n
  1. 运行此命令以确保它正在运行,您应该看到该端口具有您提供的值
  2. \n
\n
\n
docker container ls\n
Run Code Online (Sandbox Code Playgroud)\n
\n
    \n
  1. 然后在 .net 项目中从 nuget 包管理器控制台安装以下 nuget 包或使用 GUI 包管理器。当前版本需要使用 .net 4.6.2。
  2. \n
\n
\n
Install-Package Microsoft.Web.RedisSessionStateProvider\n
Run Code Online (Sandbox Code Playgroud)\n
\n
    \n
  1. 安装后,在Web.config中注释掉或删除此行
  2. \n
\n
\n
<sessionState mode="InProc" timeout="60" />\n
Run Code Online (Sandbox Code Playgroud)\n
\n
    \n
  1. 然后更新或更改 nuget 包将添加到Web.config的新提供程序。这应该位于system.web标记内。请注意,我使用了连接字符串,因为它目前还不会托管在 azure 上,但有很多令人困惑的额外选项来配置它。
  2. \n
\n
\n
<sessionState mode="Custom" customProvider="MySessionStateStore">\n  <providers>\n  <add name="MySessionStateStore"\n       type="Microsoft.Web.Redis.RedisSessionStateProvider"\n       connectionString="localhost:8055,password=your_long_password_here"/>\n  </providers>\n</sessionState>\n
Run Code Online (Sandbox Code Playgroud)\n
\n
    \n
  1. 您需要确保在 iis 会话中存储的所有对象都具有 [Serialized] 属性,否则它将无法工作并会引发错误。
  2. \n
\n

您现在应该看到可以无缝运行您的网站,并且您现在将使用 Redis 缓存,而不再使用会话状态。

\n