【发布时间】:2021-02-27 10:52:49
【问题描述】:
首先,当我向所有客户端发送 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 相同。
而且我没有收到客户的任何通知。问题是,在documentation 中写的是,在集线器中它应该是:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
这很令人困惑,因为没有像Send(string message) 这样的方法。我做错了什么?
更新基于on this GitHub answer,在发送个人消息时我尝试过:
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?
【问题讨论】:
标签: c# angular signalr asp.net-core-2.2