首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例字典不是单例

单例字典不是单例
EN

Stack Overflow用户
提问于 2018-04-19 15:22:56
回答 1查看 614关注 0票数 0

我有一本单身汉的字典。我将这对保存在那里,每次从创建令牌的方法访问字典时,它都会显示我在那里存储的所有凭据。

但是,当我从解决方案的另一个项目中的另一个类访问时,它会显示字典为空。有人能告诉我为什么会这样吗?

这是管理字典的类:

代码语言:javascript
复制
public class UserAccessToken
{
    public Dictionary<string, string> UserDictionary { get; set; }

    private static UserAccessToken _instance;

    private UserAccessToken() { }

    public static UserAccessToken Instance
    {
        get
        {
            if (_instance == null)
                _instance = new UserAccessToken
                {
                    UserDictionary = new Dictionary<string, string>()
                };
            return _instance;
        }
    }
}

--这是在字典中插入键值对的方法:

代码语言:javascript
复制
public override Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context)
    {
        var accessToken = context.AccessToken;

        if (context.Properties.Dictionary.ContainsKey("userName"))
        {
            var username = context.Properties.Dictionary["userName"];
            // If I access here multiple times the singleton works
            UserAccessToken.Instance.UserDictionary[username] = accessToken;
        }
        return Task.FromResult<object>(null);
    }

--这是我访问字典的方法,从这里我可以看到它是空的:

代码语言:javascript
复制
private bool IsTokenValid(HttpContextBase httpContext)
    {
        var username = httpContext.User.Identity.Name;
        var userTokens = UserAccessToken.Instance.UserDictionary;
        var tokenToAccess = httpContext.Request.Headers["Authorization"];
        tokenToAccess = tokenToAccess.Replace("Bearer ", "");
        if (userTokens.ContainsKey(username))
        {
            var token = userTokens[username];
            if (token == tokenToAccess) return true;
        }
        return true;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 12:24:31

我已经解决了我的问题,但我会让我的解决方案,以防止可能是有用的人。

问题是,如果您正在运行两个不同的项目,这将意味着两个不同的过程,所以,我想要做的是非常不可能的。我用的是Redis,它运行得很好。

这是Redis使用的一个例子:

代码语言:javascript
复制
public class CallManagerCache : ICallManagerMethods{


    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer
        .Connect(CloudConfigurationManager.GetSetting("RedisConnectionString")));

    public static ConnectionMultiplexer cacheConnection
    {
        get
        {
            return lazyConnection.Value;
        }
    }

    /// <summary>
    ///     Here you save the value in cache, you get the connection, then StringSetAsync is in charge of saving the value
    /// </summary>
    /// <param name="name"></param>
    /// <param name="template"></param>
    public async Task UpdateCallInstance(int id, byte[] data, bool instanceForCallback = false, TimeSpan? timespan = null)
    {
        var cache = cacheConnection.GetDatabase();
        await cache.StringSetAsync(instanceForCallback ? $"Call_{id}" : id.ToString(), data, timespan ?? new TimeSpan(0, 0, 15, 0));
    }

    /// <summary>
    ///     Here you get the value in cache, you get the connection, then StringGetAsync is in charge of getting the value
    /// </summary>
    /// <param name="name"></param>
    /// <param name="template"></param>
    public async Task<CallInstance> GetById(int id, bool isForCallback)
    {
        var cache = cacheConnection.GetDatabase();

        var callInstance = new CallInstance
        {
            Id = id,
            InstanceData = await cache.StringGetAsync(isForCallback ? $"Call_{id}" : id.ToString())
        };
        return callInstance;

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49924741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档