有没有办法使全局变量不依赖于会话? 我想要一个所有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会话是否依赖?还是仅仅是不正确使用界面的问题?
非常感谢您的帮助。
答案 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>();
}