如何通过SignalR方法获得对象填充?

时间:2019-07-01 10:15:39

标签: c# asp.net signalr signalr-hub

这是我的问题:

我想要从控制器调用signalR函数来获取连接的用户列表。 在我的OnConnected()的OnDisconnected方法中,我收集了正确的数据,但是当我创建自己的方法时,我无法获得用户列表。

我觉得自己的上下文有问题,因为我的清单为空,但我真的不知道为什么。

我已经尝试过一些测试:

这是在我的应用程序中与SignalR连接的用户数的计数器。 用户列表使用OnConnected()方法填充,并使用OnDisconnected()进行清理

添加了一个OnConnected()用户:

public override async Task OnConnected()
        {
            var currentCollab = Context.User.Identity.Name.Length > 0 ? Context.User.Identity.Name : "";
            var module = Context.QueryString["module"];

            if (!string.IsNullOrEmpty(module))
            {
                SignalRUsers.Add(new UserConnected()
                {
                    ConnectionId = Context.ConnectionId,
                    UserName = currentCollab,
                    ModuleActif = module
                });
            }


            await Clients.All.UpdateCountAccueil(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)));

            await base.OnConnected();
        }

在此方法SignalRUsers中,该列表充满了以前的所有连接,但是,一旦我尝试从该方法中检索此列表中的值以在控制器中调用它,该列表就完全为空(许多活动的连接)

完成集线器类:


using System;
using System.Activities.Statements;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Util;
using System.Windows.Forms;
using ConvergenceCore.ServiceSettingsManager;
using ConvergenceDataAccess.ActiveDirectory;
using Microsoft.AspNet.SignalR;

namespace Main
{

    public class ChatHub : Hub
    {
        private static long counterAccueil = 0;
        private static long counterParam = 0;


        static Dictionary<string, int> CurrentConnections = new Dictionary<string, int>();
        static List<UserConnected> SignalRUsers = new List<UserConnected>();


        public void Send(string module, string etat, string message)
        {

            // Call the broadcastMessage method to update clients.
            Clients.All.broadcastMessage(module, etat, message);
        }


        public override async Task OnReconnected()
        {

            var currentCollab = Context.User.Identity.Name.Length > 0 ? Context.User.Identity.Name : "";
            var module = Context.QueryString["module"];

            if (!string.IsNullOrEmpty(module))
            {
                SignalRUsers.Add(new UserConnected()
                {
                    ConnectionId = Context.ConnectionId,
                    UserName = currentCollab,
                    ModuleActif = module
                });
            }

            await Clients.All.UpdateCountAccueil(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)));
            await Clients.All.UpdateCountParam(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Param.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Param.Value)));
            await Clients.All.UpdateCountRh(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Rh.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Rh.Value)));
            await Clients.All.UpdateCountFacturation(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Facturation.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Facturation.Value)));


            await base.OnReconnected();
        }

        public override async Task OnConnected()
        {
            var currentCollab = Context.User.Identity.Name.Length > 0 ? Context.User.Identity.Name : "";
            var module = Context.QueryString["module"];

            if (!string.IsNullOrEmpty(module))
            {
                SignalRUsers.Add(new UserConnected()
                {
                    ConnectionId = Context.ConnectionId,
                    UserName = currentCollab,
                    ModuleActif = module
                });
            }


            await Clients.All.UpdateCountAccueil(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)));
            await Clients.All.UpdateCountParam(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Param.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Param.Value)));
            await Clients.All.UpdateCountRh(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Rh.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Rh.Value)));
            await Clients.All.UpdateCountFacturation(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Facturation.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Facturation.Value)));

            await base.OnConnected();
        }

        public override async Task OnDisconnected(bool stopCalled)
        {
            var userToDelete = SignalRUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
            SignalRUsers.Remove(userToDelete);
            //CurrentConnections.Remove(module + Context.ConnectionId);

            await Clients.All.UpdateCountAccueil(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Accueil.Value)));
            await Clients.All.UpdateCountParam(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Param.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Param.Value)));
            await Clients.All.UpdateCountRh(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Rh.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Rh.Value)));
            await Clients.All.UpdateCountFacturation(SignalRUsers.Count(x => x.ModuleActif.ToUpper().Equals(ModuleName.Facturation.Value)), SignalRUsers.Where(x => x.ModuleActif.ToUpper().Equals(ModuleName.Facturation.Value)));

            await base.OnDisconnected(stopCalled);

        }

        public List<UserConnected> GetListUsersConnected(string module)
        {
            return SignalRUsers.Where(x => x.ModuleActif == module).ToList();
        }
    }

    public class UserConnected
    {
        public string UserName { get; set; }
        public string ConnectionId { get; set; }
        public string ModuleActif { get; set; }

    }
}

在我的控制器中:

 public PartialViewResult DetailUsersConnected(string module)
        {
           ChatHub hub = new ChatHub();
           var listUsers = hub.GetListUsersConnected(module);

            return PartialView("../Parametrages/Content/_DetailsUserConnected", listUsers);
        }

为什么我的GetListUsersConnected方法中的列表为空?

为什么我不能恢复遇到的以前的连接,例如OnConnected()?

1 个答案:

答案 0 :(得分:0)

每次客户端连接时,都会创建一个Hub对象的新实例。如果您的SignalRUsers是集线器的属性,则每次都会从头开始创建。尝试将其设置为静态属性,或在容器中使用Singleton。