SignalR Hub, размещенный в Azure, пропускает сообщение для нескольких соединений - AspNetCore.SignalR - PullRequest
0 голосов
/ 17 сентября 2018

Я использую Microsoft.AspNetCore.SignalR для трансляции сообщения всем подключенным клиентам.Концентратор размещается в Azure как служба приложений.

Я могу видеть идентификаторы подключений подключенного клиента, вставив их в таблицу в БД.

Когда я запускаю трансляцию, сообщения отправляются только 8 из 10 клиентов (всегда пропускает несколько клиентов).Статус пропущенных клиентов регистрируется как подключенный в БД.

Мой код концентратора:

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));

Пожалуйста, помогите мне, почему он случайно пропускает несколько клиентов.Я пытался найти много статей и справок, но не смог найти что-то конкретное для этой проблемы.

...