【问题标题】:Clients not receiving message in signalr客户端未在信号器中接收消息
【发布时间】:2021-11-09 15:03:08
【问题描述】:

我的信号器连接的客户端没有收到消息。 我的聊天室:

public class Chathub : Hub
    {
        private readonly string _botUser;
        private readonly string _globalRoom;
        public Chathub()
        {
            _botUser = "My Chatbot";
            _globalRoom = "Lobby";
        }
        public async Task Join(string message)
        {
            //await Groups.AddToGroupAsync(Context.ConnectionId, _globalRoom);
            //await Clients.Group(_globalRoom).SendAsync("ReceiveMessage", $"{_botUser} : Welcome {message}");
            await Clients.All.SendAsync("ReceiveMessage", $"{_botUser} : Welcome {Context.ConnectionId}"); //Checking connectionid
            //await Clients.All.SendAsync("ReceiveMessage", $"{_botUser} : Welcome {message}");
        }
    }

我在 SharedService 中定义了集线器连接:

export class SharedService {

  public readonly URL = "https://localhost:44333/";
  private hubConnection: HubConnection;

  messageModel: Message = {
    message: null
  }

  constructor(private http: HttpClient) {
    this.BuildConnection();
    this.StartConnection();
    this.JoinMessage();
  }

  public BuildConnection = () => {
    this.hubConnection = new HubConnectionBuilder().withUrl('/chathub').build();

  }

  public StartConnection = () => {
    this.hubConnection.start()
      .then(() => console.log("Connection started...."))
      .catch(err => console.log(err));
  }

  LoginUser(UserModel: User): Observable<User> {
    this.hubConnection.invoke("Join", UserModel.userName);
    return this.http.post<User>(this.URL + "Account/LoginUser", UserModel);
  }

  JoinMessage(): Observable<string> {
    this.hubConnection.on("ReceiveMessage", (messages) => {
      this.messageModel.message = messages;
    });
    return of(this.messageModel.message);
  }

我有两个能力。一旦用户登录,hubconnection 就会启动并被路由到另一个显示欢迎消息的组件。 消息是这样显示的

export class MainPageComponent implements OnInit {

  public messages = [];

  constructor(public service: SharedService) {}

  ngOnInit() {
    this.DisplayMessage();
  }

  public DisplayMessage() {
    this.service.JoinMessage().subscribe((data) => this.messages.push(data));
  }
}

当我打开两个选项卡并登录时,欢迎消息不会在这两个选项卡之间共享。第一个登录的客户端没有收到欢迎第二个客户端的消息。我假设 chathub 中的 connectionId 应该相同,以便两个客户端相互通信,但它是不同的。

【问题讨论】:

    标签: angular asp.net-core signalr


    【解决方案1】:

    订阅时需要返回正确的 Observable(此处不要使用of(),而是使用Subject.next()

    private message$: Subject<any> = new Subject();
    
     JoinMessage(): Observable<string> {
        this.hubConnection.on("ReceiveMessage", (messages) => {
          this.message$.next(messages);
        });
        return this.message$.asObservable();
      }
    

    【讨论】:

    • 嗨@Alexey。这部分有效,但存在一些问题。首先,用户一登录就没有收到消息。喜欢欢迎用户 1 其次,第一个登录的用户在用户 2 登录时收到两条欢迎消息。喜欢欢迎用户 2 两次。
    • @ShanksLimbu 第一个问题与用户在hub收到消息后订阅Subject有关,可以通过使用BehaviorSubjectReplaySubject来解决,缓冲区大小为1 Subject (有关更多详细信息,请参阅文档)。第二个问题出现了,因为您似乎调用了两次JonMessage,每个用户只能调用一次
    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 2012-04-07
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多