全球变量不依赖于会话

时间:2018-10-01 13:11:28

标签: c# asp.net-core

有没有办法使全局变量不依赖于会话? 我想要一个所有SignalR连接的列表以及来自数据库的用户ID。

到目前为止,我有这样的事情:

public class SignalRUsersService : ISignalRUsersService
{
    private int userId;
    private readonly IHttpContextAccessor _accessor;
    public List<ConnectedSignalR> SignalRUsers;
    public SignalRUsersService( IHttpContextAccessor accessor)
    {
        _accessor = accessor;
        try
        {
            userId = Convert.ToInt32(_accessor.HttpContext.Session.GetString("uID"));
        }
        catch
        {
            userId = 0;
        }
        SignalRUsers = new List<ConnectedSignalR>();
    }


    public void AddSignalRUser(string ConnID)
    {
        SignalRUsers.Add(new ConnectedSignalR()
        {
            ConnID = ConnID,
            UserID = userId
        });
    }
    public void RemoveSignalRUser(string ConnID)
    {
        var usr = SignalRUsers.Where(a => a.ConnID == ConnID).FirstOrDefault();
        if (usr != null)
        {
            SignalRUsers.Remove(usr);
        }
    }
    public List<ConnectedSignalR> GetSignalRUsers()
    {
        return SignalRUsers;
    }
}

问题是每次我使用该接口时,似乎都在重新初始化SignalRUsers列表。而且,即使我将列表中的数据推送出去,在需要时也发现它为null。

SignalRUsers会话是否依赖?还是仅仅是不正确使用界面的问题?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

SignalR集线器是瞬态的,这意味着从客户端收到方法调用时会创建一个新实例(请参见:https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-server)。

您可能正在将此服务注入到集线器类中,这意味着您可以使用依赖项注入配置来控制服务类的生存期。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ISignalRUsersService, SignalRUsersService>();
}