【发布时间】:2021-08-24 04:30:38
【问题描述】:
.NET Core API 应用程序,我想使用它来将实时消息推送到 SPA。我有 azure 函数的工作示例,但现在我想将其转换为 Web API。
正在运行的 Azure 函数如下所示:
[FunctionName("Push")]
public static Task PushInfoSuccess([HttpTrigger(AuthorizationLevel.Anonymous, "post")] ILogger log, Models models
[SignalR(HubName = "Hub1")] IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
UserId = models.UserId,
Target = "Hub1",
Arguments = new[] { models}
});
}
我想使用 .NET Core API 重写。
我创建了如下所示的中心类
public class ChatHub : Hub
{
public Task BroadcastMessage(string name, string message) =>
Clients.All.SendAsync("broadcastMessage", name, message);
public void Send(UserModel userModel)
{
Clients.User(userModel.UserId).SendAsync(userModel.Message);
}
public Task Echo(string name, string message) =>
Clients.Client(Context.ConnectionId)
.SendAsync("echo", name, $"{message} (echo from server)");
}
我有这个模型类:
public class UserModel
{
public string UserId { get; set; }
public string Message { get; set; }
}
现在我有一些其他应用程序将通过 API 调用我的应用程序,因此我将添加控制器
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public ActionResult Get(UserModel userModel)
{
return Ok();
}
}
我的其他应用程序将调用此 API 将通知推送到 SPA。推送通知时,我想将其推送到特定的用户 ID,我将通过 API 获取用户 ID 和消息。现在我想将消息推送到 UserModel.UserID。向特定用户发送消息时,我是否还需要考虑连接 ID?如果我有多个集线器,那么每个集线器是否会获得不同的连接 ID?在我的 SPA 应用程序中,我有多个集线器。那么连接ID和用户ID之间的关系是什么?有人可以在这里帮助我理解和帮助我吗?谢谢
【问题讨论】:
-
是的,您还必须考虑
ConnectionId。通常,我们应该有一个connectionId和userId来广播我们的更新。因此,当您有多个集线器时,必须在_userConnectionManager.GetUserConnections(model.userId);上循环并将其发送到特定的连接,例如await _notificationUserHubContext.Clients.Client(connectionId).SendAsync("sendToUser", yourModel);但如果您有单个集线器,则只需将其推送到单个 connectId,在这种情况下不需要循环。 -
感谢 MD Farid Uddin Kiron。所以会有一个集线器的connectionid。每当我有多个集线器时,我都会有多个连接ID。那么connectionids加上userid会变成uniquness吧?谢谢
-
能否请您看一下示例,它可能会指导您。
-
@MrPerfect 使用并发字典来管理您的用户和连接。它们是线程安全的,但我还是建议使用 SemaphoreSlim 类。在您的字典中返回一个复杂对象,该对象可以为每个用户处理多个连接 ID。如果将这些连接 ID 存储在 HashSet 中,则不必担心重复。 SignalR 通常会在释放旧的连接 ID 之前分配一个新的连接 ID。
标签: c# asp.net-core signalr azure-signalr