如何从 Blazor 应用创建 SignalR 组
How to create SignalR groups from Blazor app
我有一个(服务器端)blazor 应用程序,我想让用户填写一个小表格,然后按一个按钮来创建 SignalR 组,然后他们可以向该组发送消息。
我有一个集线器 class,看起来像这样:
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 组件调用的服务 class,如下所示:
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;
}
}
当我在 Startup.cs
和 运行 我的应用程序中将 RoomHub
class 添加到我的服务时,当我按下按钮创建一个组时,它告诉我Hub 的 Context
变量为空且失败。
我试过寻找其他方法来做到这一点,并得出结论,它与注入 IHubContext<RoomHub>
对象有关,但它提供的对象似乎与全部到我的 Hub class,我不能用它直接创建组,因为我无权访问 ConnectionId
我需要这样做。
我觉得 Hub 和 HubContext 之间有一个我不明白的差距。从在 Blazor 组件上按下按钮开始,创建 SignalR 组的正确方法是什么?
在您可以访问您的 Hub 之前,您需要使用 HubConnection
和 HubConnectionBuilder
建立并启动您的 Hub 连接。这需要包括集线器的 url 和从集线器接收的数据的处理程序方法。
首先在您的服务中添加一个 HubConnection 字段 class。
private HubConnection _hubConnection;
根据您的服务生命周期和其他考虑因素,您可以在服务 class 构造函数或其自己的方法中建立连接。例如,我们将添加 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 与您打算执行的操作类似。
我有一个(服务器端)blazor 应用程序,我想让用户填写一个小表格,然后按一个按钮来创建 SignalR 组,然后他们可以向该组发送消息。
我有一个集线器 class,看起来像这样:
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 组件调用的服务 class,如下所示:
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;
}
}
当我在 Startup.cs
和 运行 我的应用程序中将 RoomHub
class 添加到我的服务时,当我按下按钮创建一个组时,它告诉我Hub 的 Context
变量为空且失败。
我试过寻找其他方法来做到这一点,并得出结论,它与注入 IHubContext<RoomHub>
对象有关,但它提供的对象似乎与全部到我的 Hub class,我不能用它直接创建组,因为我无权访问 ConnectionId
我需要这样做。
我觉得 Hub 和 HubContext 之间有一个我不明白的差距。从在 Blazor 组件上按下按钮开始,创建 SignalR 组的正确方法是什么?
在您可以访问您的 Hub 之前,您需要使用 HubConnection
和 HubConnectionBuilder
建立并启动您的 Hub 连接。这需要包括集线器的 url 和从集线器接收的数据的处理程序方法。
首先在您的服务中添加一个 HubConnection 字段 class。
private HubConnection _hubConnection;
根据您的服务生命周期和其他考虑因素,您可以在服务 class 构造函数或其自己的方法中建立连接。例如,我们将添加 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 与您打算执行的操作类似。