We use SignalR library 2.4.2 version in our ASP.NET MVC web application. Usually it works fine but sometimes I don't know why all currents clients connected send /MyApp/signalr/connect request (some /aborts and /pings also) and server doesn't receive any more request, cpu usage increase and IIS get blocked.Then pool is recycled because of recycling rules
IIS log is like:
Server side:
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();
}
}
}
Client side:
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(){
})
Any idea of why happen this?? Thank you!
