У меня есть (серверное) приложение для блейзеров, и я хочу позволить пользователям заполнить небольшую форму и нажать кнопку, чтобы создать группы 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?