SignalR HubContext отправляется только одному клиенту - PullRequest
0 голосов
/ 06 августа 2020

Есть ли возможность отправить уведомление SignalR одному клиенту только через IHubContext<>? У меня есть API с JWT. У меня есть PostsController, который сохраняет некоторые «сообщения» в базе данных. Я бы хотел отправить уведомление всем подписчикам автора сообщения после добавления сообщения в базу данных. Я знаю, что могу сделать это, вызвав HubConnection в моем приложении JS / Xamarin, но есть ли возможность сделать это через 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();
        }
    }

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Да, вы можете использовать контекст концентратора для отправки сообщений всем клиентам напрямую:

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

Более подробная информация: https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1

Вы можете использовать концепция групп SignalR для отправки сообщения всем подписчикам автора сообщения. В итоге вы должны добавлять пользователя в нужную группу каждый раз, когда он подключается к хабу.

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

0 голосов
/ 06 августа 2020

Если вы не хотите отправлять всем клиентам,

я бы предложил вам использовать Группы

...