首页 > 解决方案 > 托管在 azure 中的 SignalR Hub 未向少数连接发送消息 - AspNetCore.SignalR

问题描述

我正在使用 Microsoft.AspNetCore.SignalR 向所有连接的客户端广播消息。集线器作为应用服务托管在 Azure 中。

我可以通过将连接的客户端的连接 ID 插入数据库中的表来查看它们。

当我点击广播时,消息仅发送给 10 个客户中的 8 个(总是错过几个客户)。错过的客户端的状态在 DB 中记录为已连接。

我的中心代码:

public class NotificationHub : Hub
{
   public override async Task OnConnectedAsync()
   {
     ****Here I insert the connection IDs to DB with connected status***
     await Groups.AddToGroupAsync(Context.ConnectionId, "SignalRUsers_" + Context.ConnectionId);
     await base.OnConnectedAsync();
   }
}

我从集线器外部调用 HubContext,因为我需要在外部进程完成时广播消息。

我的广播员代码:

public class SignalBroadcaster : ISignalBroadcaster
{
  private readonly IHubContext<NotificationHub> _hubContext;

  public class SignalRConnections
  {
    public string ConnectionId { get; set; }
    public DateTime ConnectedOn { get; set; }
    public string Status { get; set; }

  }

  public SignalBroadcaster(IHubContext<NotificationHub1> hubContext)
  {
    _hubContext = hubContext;
  }

  public async void BroadcastToAll(ISignal signal, TelemetryClient log)
  {
    List<SignalRConnections> lstsignalRConnections = new List<SignalRConnections>();

    try
    {
        using (SqlConnection conn = new SqlConnection(Environment.GetEnvironmentVariable("XXXXXXX")))
        {
            using (SqlCommand command = new SqlCommand("", conn))
            {
                try
                {
                    conn.Open();

                    command.CommandText = "SELECT * FROM SignalRXXXXXXX WHERE SignalRStatus = 'CONNECTED'";

                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            SignalRConnections signalRConnections = new SignalRConnections()
                            {
                                ConnectionId = reader.GetString(0),
                                ConnectedOn = reader.GetDateTime(1),
                                Status = reader.GetString(2),

                            };

                            lstsignalRConnections.Add(signalRConnections);
                        }
                    }

                }
                catch (Exception ex)
                {
                    //command.CommandText = "INSERT INTO SignalRConnections (ConnectionId,ConnectedOn,SignalRStatus) VALUES ('" + Context.ConnectionId + "',GETDATE(),'DISCONNECTED')";
                    //command.ExecuteNonQuery();
                }
                finally
                {
                    conn.Close();
                }
            }
        }

        foreach (var item in lstsignalRConnections)
        {
            try
            {                        
                await _hubContext.Clients.Client(item.ConnectionId).SendAsync("ReceiveMessage", signal.JobId, signal.QuantificationResult, signal.JobType);
                log.TrackTrace("SignalR sent: " + item.ConnectionId);
            }
            catch(Exception ex)
            {
                log.TrackTrace("SignalR send failed: " + item.ConnectionId + " Exception :" + ex.ToString());
            }
        }
    }
    catch (Exception ex)
    {
      Exception exp=  new Exception(String.Format(Constants.GETDATAEXCEPTIONMESSAGE, "BroadcastToAll ", ex.InnerException));
    }

}
}

请忽略这里的数据库连接混乱,因为我这样做是为了测试目的。稍后会重构。

我的客户代码:

connection.on("ReceiveMessage", (user, message,msg1) => {

var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
var encodedMsg = user + " says " + msg + msg1;
var li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
connection.start().catch(err => console.log(err));

请帮助我为什么随机丢失少数客户。我尝试搜索大量文章和帮助,但找不到特定于该问题的内容。

标签: c#azureasp.net-coresignalr

解决方案


推荐阅读