c# - 向特定用户问题发送 SignalR 消息。我做错了什么?
问题描述
首先,当我向所有客户端发送 SignalR 消息时,一切正常,其中:
public async Task SendMessage(GameStateModel game)
{
UpdateExistingGame(game);
await Clients.All.SendAsync("ReceiveMessage", game); //todo: send only to users in current game
}
在我的客户中:
public addGameStateListener = (): void => {
this.hubConnection.on('ReceiveMessage', (message: GameState) => {
if (message.gameId == this.game.gameState.gameId) {
this.game.setGame(message);
}
});
};
现在,当我尝试将其发送到特定客户端时,我正在做这样的事情:
public async Task SendMessage(GameStateModel game) //todo: SendMessageAndUpdateCachedGame(GameStateModel game)
{
UpdateExistingGame(game);
await SendToUsersInGame(game);
}
private async Task SendToUsersInGame(GameStateModel game)
{
foreach (string user in game.PlayersNames)
{
if (!string.IsNullOrEmpty(user))
{
string id = await GetUserId(user);
await Clients.User(id).SendAsync("ReceiveMessage", game);
}
}
}
private async Task<string> GetUserId(string user) //from auth DB
{
return await _userService.GetUserId(user);
}
客户端代码仍然相同:
public addGameStateListener = (): void => {
this.hubConnection.on('ReceiveMessage', (message: GameState) => {
if (message.gameId == this.game.gameState.gameId) {
this.game.setGame(message);
}
});
};
注意请注意,这GetUserId
是从数据库中检索用户 ID,但它与Context.User.Identity.Name
.
而且我没有收到客户的任何通知。问题是,在文档中它是编写的,在集线器中它应该是:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
这很令人困惑,因为没有像 a 这样的方法Send(string message)
。我究竟做错了什么?
更新基于此 GitHub 答案,在发送我尝试的单个消息时:
foreach (string user in game.PlayersNames)
{
if (!string.IsNullOrEmpty(user))
{
string id = await GetUserId(user);
await Clients.Client(Context.ConnectionId).SendAsync("ReceiveMessage", game);
}
}
那么现在的问题是,如何获取每个用户的个人信息Context.ConnectionId
?
解决方案
早些时候我试图解决同样的问题,所以我的客户有他的 id(在数据库和客户端相同),我添加了 if 语句,如 if(this.client.id == received.id) => do smth。它工作正常。
推荐阅读
- javascript - Angular - 在项目中保留变量的最佳方法
- javascript - API 响应正文在 IDE 上被视为字符串,但在本地托管服务器上显示时被视为对象
- entity-framework-core - EF Core 中的一对一关系抛出
- python - 使用 Seaborn 和 Matplotlib 时 tcl 不工作
- c - 为什么我们可以比较字符常量?
- java - 为什么 RxJava2 不向线程发送数据
- maven - Quarkus 项目 Graal Native 使用 Maven
- c# - UWP Listview 在水平滚动中冻结列
- markdown - 如何使用 Blazor 在 textarea 或 inputTextArea 内渲染 MarkDown
- css - Bulma:无法在按钮上同时使用 is-static 和 is-primary 修改