SignalR hubConnection.on 不工作。 Clients.Others.SendAsync 和 hubConnection.on 沟通不畅

SignalR hubConnection.on is not working. Clients.Others.SendAsync and hubConnection.on are not communicating well

我目前正在尝试构建一个涉及 SignalR 的集线器连接功能的应用程序。最终,我想让该应用程序能够处理实时聊天,但首先我想检查 SignalR 的基本部分是否正常工作。

我试图确保在用户登录时显示通知集线器连接的 toastr,但问题是没有显示 toastr。这是我的一些代码。

[PresenceHub.cs]

public class PresenceHub : Hub
{
    private readonly ILogger<PresenceHub> _logger;
    public PresenceHub(ILogger<PresenceHub> logger)
    {
        _logger = logger;
    }
    public override async Task OnConnectedAsync()
    {
        _logger.LogInformation(Context.User.GetUserName());
        await Clients.Others.SendAsync("UserIsOnline", Context.User.GetUserName());
    }
    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await Clients.Others.SendAsync("UserIsOffline", Context.User.GetUserName());

        await base.OnDisconnectedAsync(exception);
    }
...

[presence.service.ts]

export class PresenceService {
  hubUrl = environment.hubUrl; 
  private hubConnection: HubConnection

  constructor(private toastr: ToastrService) { }

  createHubConnection(user: User){
    this.hubConnection = new HubConnectionBuilder()
      .withUrl(this.hubUrl + 'presence', {
        accessTokenFactory: () => user.token
      })
      .withAutomaticReconnect()
      .build()
    
    this.hubConnection
      .start()
      .then(() => {
        console.log("hubConnection started for " + user.username);
        console.log("user token: " + user.token);
        this.toastr.success("Inside the createHubConnection")
      }) 
      .catch(error => console.log(error))
    
    this.hubConnection.on('UserIsOnline', username => { 
      console.log(username + ' has connected'); 
      this.toastr.success(username + 'has connected');
    })

    this.hubConnection.on('UserIsOffline', username => {
      console.log(username + ' has disconnected'); 
      this.toastr.success(username + ' has disconnected');
    })
...

通过上面的代码,我已经确认

知道我应该调查哪些其他可能性吗?

问题是您在服务器端使用 Clients.Others。这意味着将此消息发送给所有 other 连接,而不是您的连接。如果您想向自己发送消息,您需要 Clients.Caller,或者向所有连接发送消息 Clients.All

此外,您应该将 this.hubConnection.on('UserIsOnline', ...) 移动到 this.hubConnection.start() 之前,以消除在您的方法在客户端注册之前服务器响应的可能竞争条件。