Как создать группы SignalR из приложения Blazor - PullRequest
0 голосов
/ 01 апреля 2020

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

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

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);
    }
}

и класс Service, который вызывается из моего компонента Blazor, который выглядит следующим образом:

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 и запускаю мое приложение, когда я нажимаю кнопку для создания группы, она сообщает мне, что переменная Context хаба имеет значение null и не работает.

Я пытался искать другие способы сделать это и пришел к выводу, что он имеет какое-то отношение к внедрению объекта IHubContext<RoomHub>, но этот объект, кажется, не имеет никакого отношения к моему классу Hub, и я не могу использовать его для непосредственного создания групп, потому что я не У меня нет доступа к ConnectionId Мне нужно это сделать.

Мне кажется, что между Hub и HubContext существует разрыв, которого я не понимаю. Как правильно создать группу SignalR, начиная с нажатия кнопки на компоненте Blazor?

1 Ответ

1 голос
/ 11 апреля 2020

Прежде чем вы сможете получить доступ к вашему концентратору, вам необходимо создать и запустить подключение к концентратору, используя HubConnection и HubConnectionBuilder. Это должно включать URL-адрес вашего концентратора и методы-обработчики для данных, полученных от концентратора.

Начните с добавления поля HubConnection в ваш класс обслуживания.

private HubConnection _hubConnection;

В зависимости от вашего Срок службы службы и другие соображения. Вы можете построить свое соединение в конструкторе класса Service или в его собственном методе. Например, мы добавим задачу StartConnectionAsyn c.

    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();
    }

Без использования типизированного концентратора вы будете вызывать методы вашего концентратора с использованием строк magi c. например,

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

Это должно помочь вам начать. Исходя из того, что вы опубликовали выше, я думаю это репозиторий github похоже на то, что вы собираетесь делать.

...