从RedisSessionStateProvider获取活动会话列表

时间:2016-06-27 08:23:27

标签: c# asp.net-mvc session azure redis

在我的Azure ASP.NET MVC网站中,我想显示有多少客户端连接到Redis会话状态提供程序以及它们处于活动状态的时间。我在Azure Github上使用aspnet-redis-providers lib。

在Redis中,它使用SessionTimeout键创建{[app_name] _ [sessionkey} _Internal键,其中包含已配置的会话超时值。该密钥的EXPIRE设置为该时间,当您检查密钥的TTL时,您会看到会话访问权限。

如何使用会话状态提供程序库来访问此信息?如果那是不可能的,我是否可以使用任何其他库来安全地查询此信息,而不会干扰会话状态提供者?

1 个答案:

答案 0 :(得分:1)

这是我能够做到的。我创建了自己的会话对象集合并抓住了所有密钥(我将其放入DB 1中)然后我遍历所有密钥并获取TTL。

using StackExchange.Redis;
using StackExchange.Redis.Extensions.Newtonsoft;
using StackExchange.Redis.Extensions.Core;
using System.Linq;

    private static Lazy<ConnectionMultiplexer> conn = new Lazy<ConnectionMultiplexer>(
       () => ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["RedisServerMaster"]
         + "," + ConfigurationManager.AppSettings["RedisServerSlave"]
         + "," + ConfigurationManager.AppSettings["RedisOptions"])

    public class SessionObjects
    {
        public string SessionId { get; set; }
        public TimeSpan? TTL { get; set; }
    }

    List<SessionObjects> lso = new List<SessionObjects>();
    var serializer = new NewtonsoftSerializer();
    StackExchangeRedisCacheClient cacheClient;
    cacheClient = new StackExchangeRedisCacheClient(rConn, serializer, 1);
    IEnumerable<string> keys = cacheClient.SearchKeys("*");
    var db = rConn.GetDatabase(1);
    foreach (var s in keys)
    {
        SessionObjects so = new SessionObjects();
        so.SessionId = s;
        so.TTL = db.KeyTimeToLive(s);
        lso.Add(so);
    }