【问题标题】:SignalR try to connect all current clients and CPU usage increase up to 100%SignalR 尝试连接所有当前客户端,CPU 使用率增加高达 100%
【发布时间】:2022-01-06 18:04:21
【问题描述】:

我们在 ASP.NET MVC Web 应用程序中使用 SignalR 库 2.4.2 版本。通常它工作正常,但有时我不知道为什么所有当前连接的客户端都发送 /MyApp/signalr/connect 请求(一些 /aborts 和 /pings 也)并且服务器不再收到任何请求,cpu 使用率增加和 IIS 被阻止.然后pool因为回收规则而被回收

IIS 日志如下:

服务器端:

    public class SignalsDataHub : Microsoft.AspNet.SignalR.Hub
    {

        public readonly static ConnectionMapping<string> _connections =
           new ConnectionMapping<string>();

        public override Task OnConnected()
        {    
            var idMachine = Context.QueryString["idMachine"];
            var idconnection = Context.ConnectionId;

            //Ahora que tengo esta asociación puedo guardar en una tabla los clientes conectados
            _connections.Add(idMachine, Context.ConnectionId);     

            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
                var idconnection = Context.ConnectionId;
                var idMachine = Context.QueryString["idMachine"];
                //Con esto solo ya podria borrar la asociación del cliente conectado
                _connections.Remove(idMachine, idconnection);

            return base.OnDisconnected(stopCalled);
        }
        public override Task OnReconnected()
        {
            return base.OnReconnected();
        }
        
    }
 public class BroadCastSignals
    {  
        private IHubConnectionContext<dynamic> Clients { set; get; }

        private readonly object _updateValueLock = new object();

        private BroadCastSignals(IHubConnectionContext<dynamic> clients)
        {
            Clients = clients;
        }

        private readonly static Lazy<BroadCastSignals> _instance = new Lazy<BroadCastSignals>(() => new BroadCastSignals(GlobalHost.ConnectionManager.GetHubContext<SignalsDataHub>().Clients));

        public static BroadCastSignals Instance
        {
            get
            {
                return _instance.Value;
            }
        }

        public void BroadCastCycleValue(string idMachine, string value)
        {
            var client = SignalsDataHub._connections.GetConnections(idMachine);

            foreach (var connectionId in client)
            {
                Clients.Client(connectionId).DisplayCycles(value);
            }          
        }

        public void BroadCastMarchaParoValue(string idMachine)
        {
            var client = SignalsDataHub._connections.GetConnections(idMachine);

            foreach (var connectionId in client)
            {
                Clients.Client(connectionId).DisplayMarchaParo();
            }       
        }
    }

客户端:

            let currentIdMachine= '@ViewBag.idMachine'

            let broadCaster=$.connection.signalsDataHub

            //Contadores ciclos
            broadCaster.client.DisplayCycles= function (hits){
                const golpes= document.querySelector('#hits');
                if(golpes!=null){
                    golpes.innerText=hits
                }
            }

            broadCaster.client.DisplayMarchaParo= function (){
                CurrentIncidence();
            }

            $.connection.hub.qs = { "idMachine" : currentIdMachine };

            $.connection.hub.start().done(function(){
            })

知道为什么会这样吗? 谢谢!

【问题讨论】:

    标签: asp.net-mvc signalr signalr-hub


    【解决方案1】:

    我们在 2.3.0 中得到相同的行为,CPU 提高到 100%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多