Я использую 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, "&").replace(/</g, "<").replace(/>/g, ">");
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));
Пожалуйста, помогите мне, почему он случайно пропускает несколько клиентов.Я пытался найти много статей и справок, но не смог найти что-то конкретное для этой проблемы.