.net core 如何从Blazor应用程序创建信号器组

.net core 如何从Blazor应用程序创建信号器组,.net-core,signalr,blazor-server-side,asp.net-core-signalr,.net Core,Signalr,Blazor Server Side,Asp.net Core Signalr,我有一个(服务器端)blazor应用程序,我想让用户填写一个小表单,然后按下一个按钮来创建信号器组,然后他们就可以向这些组发送消息 我有一个集线器类,如下所示: 公共类RoomHub:Hub { 公共异步任务JoinRoomAsync(字符串组名) { wait Groups.AddToGroupAsync(Context.ConnectionId,groupName); } 公共异步任务LeaveRoomAsync(字符串组名) { wait Groups.RemoveFromGroupAsy

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

我有一个集线器类,如下所示:

公共类RoomHub:Hub
{
公共异步任务JoinRoomAsync(字符串组名)
{
wait Groups.AddToGroupAsync(Context.ConnectionId,groupName);
}
公共异步任务LeaveRoomAsync(字符串组名)
{
wait Groups.RemoveFromGroupAsync(Context.ConnectionId,groupName);
}
公共异步任务BroadcastToRoomAsync(字符串组名、字符串消息)
{
等待Clients.Group(groupName.SendAsync(“OnMessage”,message);
}
}
以及从blazor组件调用的服务类,如下所示:

public class RoomService:IRoomService
{
私人icosombservice(u dbService);;
私人RoomHub\u RoomHub;
公共客房服务(ICOSOMSDBSERVICE dbService,RoomHub RoomHub)
{
这个._dbService=dbService;
这个。_roomHub=roomHub;
}
公共异步任务CreateRoom(字符串名称)
{
房间r=新房间();
r、 Id=Guid.NewGuid().ToString();
r、 名称=名称;
wait_dbService.AddItemAsync(r);
wait_roomHub.JoinRoomAsync(r.Name);
返回r;
}
公共异步任务SendToRoom(r室,字符串消息)
{
wait_roomHub.broadcastoroomasync(r.Name,message);
返回;
}
}
当我在
Startup.cs
中将
RoomHub
类添加到我的服务并运行我的应用程序时,当我按下按钮创建一个组时,它告诉我Hub的
Context
变量为空且失败

我试着寻找其他方法来实现这一点,并得出结论,这与注入
IHubContext
对象有关,但是它提供的对象似乎与我的Hub类没有任何关系,我无法使用它直接创建组,因为我无法访问我需要的
ConnectionId


我觉得Hub和HubContext之间有一个我不理解的鸿沟。从按下Blazor组件上的按钮开始创建信号器组的正确方法是什么?

在访问集线器之前,您需要使用
HubConnection
HubConnectionBuilder
建立并启动集线器连接。这需要包括集线器的url和从集线器接收的数据的处理程序方法

首先在服务类中添加HubConnection字段

private hubbconnection\u hubbconnection;
根据您的服务生命周期和其他注意事项,您可以在服务类构造函数或它自己的方法中构建连接。例如,我们将添加StartConnectionAsync任务

公共异步任务StartConnectionAsync()
{
//创建连接
_hubConnection=新的HubConnectionBuilder()
.WithUrl(_-hubUrl)/\u-hubUrl是您的基本Url+中心Url
.Build();
//为客户端接收广播消息时添加处理程序
_On(“OnMessage”,this.SomeEventHandler);
//然后你开始连接
wait_hubConnection.StartAsync();
}
如果不使用类型化的Hub,您将使用魔术字符串调用Hub方法。e、 g

wait\u hubConnection.SendAsync(“JoinRoomAsync”,groupName);
这应该让你开始。根据你在上面发布的内容,我认为与你打算做的类似