c# - 托管在 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, "&").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));
请帮助我为什么随机丢失少数客户。我尝试搜索大量文章和帮助,但找不到特定于该问题的内容。
解决方案
推荐阅读
- mongodb - 为什么它返回 null 而不是 value?
- caching - 定期缓存和更新复杂数据
- python-3.x - Python 快速入门 ModuleNotFoundError:没有名为“google_auth_oauthlib”的模块
- c++ - 如何有效地从另一个字符串中找到的字符串中删除重复字符?
- project-reactor - 从 EmitterProcessor 移动到 Sinks.many()
- scala - 根据 WrappedArray 列表中的值加入数据框
- python - 点不安装包?
- django - 为什么“related_names”使我的字段成为必填项?
- scala - 无形:找不到更新程序的隐含值
- python - 与包含圆括号的边界和字符串一起使用时 re.sub 出现问题