首页 > 解决方案 > 向特定用户问题发送 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

标签: c#angularsignalrasp.net-core-2.2

解决方案


早些时候我试图解决同样的问题,所以我的客户有他的 id(在数据库和客户端相同),我添加了 if 语句,如 if(this.client.id == received.id) => do smth。它工作正常。


推荐阅读