【问题标题】:SignalR HubContext send to one client onlySignalR HubContext 仅发送到一个客户端
【发布时间】:2020-08-06 19:48:57
【问题描述】:

是否可以仅通过IHubContext<> 向一个客户发送 SignalR 通知?我有一个带有 JWT 的 API。我有一个 PostsController 将一些“帖子”保存到数据库中。我想要实现的是在帖子添加到数据库后向帖子创建者的所有关注者发送通知。我知道我可以通过在我的 JS / Xamarin 应用程序上调用 HubConnection 来做到这一点,但有没有可能通过 IHubContext<> 来做到这一点?

    [Route("api/posts")]
    [ApiController]
    public class PostsController : ControllerBase
    {
        private readonly IHubContext<MyHub> _hubContext;
        private readonly IMyService _myService;
        private readonly IUserService _userService;

        public PostsController(
            IHubContext<MyHub> hubContext,
            IMyService myService,
            IUserService userService
            )
        {
            _hubContext= hubContext;
            _myService = myService;
            _userService = userService;
        }

        [HttpPost]
        [Authorize]
        public IActionResult Callback([FromBody] Post post)
        {
            _myService.Insert(post);
            var followers = _userService.GetFollowers(post.UserId);

            foreach (var item in followers)
                  //_hubContext.Client...

            return Ok();
        }
    }

【问题讨论】:

    标签: asp.net-core .net-core signalr asp.net-core-webapi signalr-hub


    【解决方案1】:

    是的,您可以使用集线器上下文直接向所有客户端发送消息:

    _hubContext.Clients.All.SendAsync("ClientSideHubMethodName");
    

    更多详细信息: https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1

    您可以使用 SignalR 的 Groups 概念向帖子创建者的所有关注者发送消息。总结是,每次用户连接到集线器时,您都必须将用户添加到所需的组。

    public async Task AddToGroup(string groupName)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
        await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
    }
    
    public async Task RemoveFromGroup(string groupName)
    {
        await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
        await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
    }
    

    更多详细信息:https://docs.microsoft.com/en-us/aspnet/core/signalr/groups?view=aspnetcore-3.1

    【讨论】:

      【解决方案2】:

      如果您不想发送给所有客户,

      我建议你使用Groups

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多