【发布时间】: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