【问题标题】:How to create SignalR groups from Blazor app如何从 Blazor 应用创建 SignalR 组
【发布时间】:2020-04-01 15:29:07
【问题描述】:

我有一个(服务器端)blazor 应用程序,我想让用户填写一个小表格并按一个按钮来创建 SignalR 组,然后他们可以向这些组发送消息。

我有一个如下所示的 Hub 类:

public class RoomHub : Hub
{
    public async Task JoinRoomAsync(string groupName)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
    }

    public async Task LeaveRoomAsync(string groupName)
    {
        await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
    }

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

以及从我的 blazor 组件调用的 Service 类,如下所示:

public class RoomService : IRoomService
{
    private ICosmosDbService _dbService;
    private RoomHub _roomHub;

    public RoomService(ICosmosDbService dbService, RoomHub roomHub)
    {
        this._dbService = dbService;
        this._roomHub = roomHub;
    }

    public async Task<Room> CreateRoom(string name)
    {
        Room r = new Room();
        r.Id = Guid.NewGuid().ToString();
        r.Name = name;
        await _dbService.AddItemAsync(r);
        await _roomHub.JoinRoomAsync(r.Name);

        return r;
    }

    public async Task SendToRoom(Room r, string message)
    {
        await _roomHub.BroadcastToRoomAsync(r.Name, message);
        return;
    }
}

当我将RoomHub 类添加到Startup.cs 中的服务并运行我的应用程序时,当我按下按钮创建组时,它告诉我Hub 的Context 变量为空并且失败。

我已经尝试过寻找其他方法来做到这一点,并得出结论,它与注入 IHubContext&lt;RoomHub&gt; 对象有关,但它提供的对象似乎与我的 Hub 完全无关类,我不能使用它直接创建组,因为我无权访问 ConnectionId 我需要这样做。

我觉得 Hub 和 HubContext 之间存在我不理解的差距。从按下 Blazor 组件上的按钮开始,创建 SignalR 组的正确方法是什么?

【问题讨论】:

    标签: .net-core signalr blazor-server-side asp.net-core-signalr


    【解决方案1】:

    在您可以访问您的 Hub 之前,您需要使用 HubConnectionHubConnectionBuilder 建立并启动您的 Hub 连接。这需要包括您的 Hub 的 url 以及从 Hub 接收到的数据的处理程序方法。

    首先在您的服务类中添加一个 HubConnection 字段。

        private HubConnection _hubConnection;
    

    根据您的服务生命周期和其他考虑,您可以在服务类构造函数或它自己的方法中建立连接。例如,我们将添加一个 StartConnectionAsync 任务。

    public async Task StartConnectionAsync()
    {
        // Create the connection
        _hubConnection = new HubConnectionBuilder()
        .WithUrl(_hubUrl) // _hubUrl is your base Url + Hub Url
        .Build();
        // Add Handler for when a client receives a broadcast message
        _hubConnection.On<string>("OnMessage", this.SomeEventHandler);
        // Then you start the connection
        await _hubConnection.StartAsync();
    }
    

    不使用类型化的 Hub,您将使用魔术字符串调用您的 Hub 方法。例如

    await _hubConnection.SendAsync("JoinRoomAsync", groupName);
    

    这应该可以帮助您入门。根据您在上面发布的内容,我认为this github repo 与您打算做的类似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2018-09-06
      • 2020-10-19
      • 2022-09-28
      • 2021-11-26
      相关资源
      最近更新 更多