【问题标题】:.NetCore SignalR join group over API call.NetCore SignalR 通过 API 调用加入组
【发布时间】:2020-01-20 17:58:10
【问题描述】:

我有以下流程:

一个 .NetCore Web 应用程序,您可以在其中在一个集线器上创建多个组。 用户可以通过传递组名加入组的移动应用程序。 Web 应用可以向群组用户发送消息。

我可以从网络应用程序创建和加入组,但我不确定是否可以通过控制器这样做。


枢纽:

    public class VotingHub : Hub
    {

        public async Task JoinGroup(string groupName)
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
            await SendMessageToGroup(groupName , $"{ Context.ConnectionId} has joined the group { groupName}.");
        }

        public async Task SendMessageToGroup(string groupName, string message)
        {
            await Clients.Group(groupName).SendAsync("ReceivedMessage", message);
        }
    }

控制器:

    public class EventsController : Controller
    {
        private IHubContext<VotingHub> _hubContext;

        public EventsController(IHubContext<VotingHub> hubContext)
        {
            _hubContext = hubContext;
        }


        [HttpGet("/join")]
        public IActionResult JoinGroup(string groupName)
        {
            _hubContext.Groups.AddToGroupAsync(** I do not have access to ConnectionId**);
            return Ok();
        }
    }

如果这不可能,那么实现上述流程的替代方法是什么?

【问题讨论】:

    标签: api .net-core websocket signalr signalr-hub


    【解决方案1】:

    我相信这是可能的,但可以证明这是一个不好的方法。如您所见,您无权访问 connectionId 以将用户添加到组。所以最好的方法是从集线器开始,连接必须调用这个方法。想象一下这种情况:您拥有要加入组的 connectionId,并且您通过控制器 POST 它。当时的连接可能无法建立或下垂,因此该连接现在有另一个 conncetionId。

    【讨论】:

    • 我不明白如何让应用程序到达 Hub 本身。在启动类中,我将应用程序配置为使用以下端点: endpoints.MapHub("/voting"); ,如 documentation 所示。但是如何从 VotingHub 类中调用特定方法?
    • 端点只是提供给客户端代码以发出第一个请求来执行SignalR 诸如传输协商等事情......所以后者与您的集线器建立持久连接,然后您可以调用集线器中的那些方法。您必须了解如何在客户端建立与集线器的连接,以便调用您的方法。
    • 一个工作演示,您可以看到如何在客户端建立连接以及一个工作角度聊天。 github.com/Kiril1512/SignalRDemo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2019-07-12
    • 2019-12-03
    相关资源
    最近更新 更多