SignalR Asp.Net核心发送异步挂起

时间:2018-06-26 13:15:28

标签: asp.net-core signalr signalr-hub signalr.client asp.net-core-signalr

所以这是第二次发生了。我相信触发错误的原因是我尝试对MongoDb服务器进行更新时,但我仍然不知道为什么会发生这种情况,我想找出答案。

基本上,我正在使用Signalr使用以下命令将C#脚本中的json字符串数据发送到前端:

_hubContext.Clients.All.SendAsync("ReceiveMail", json);

问题是我的脚本继续广播此消息(没有任何错误或问题),但是我的客户端没有收到该消息(即使此广播已工作了数周……)。当我将广播的名称更改为其他名称时,数据将完美地传递到客户端。

示例:

//This broadcast worked fine for weeks but suddenly stopped working (without error)    
_hubContext.Clients.All.SendAsync("ReceiveMail", json);

//Changed above broadcast to this and broadcast works perfectly fine again    
_hubContext.Clients.All.SendAsync("ListenForMail", json);

TS代码:

constructor() {
    this.hubConnection = new signalR.HubConnectionBuilder()
        .withUrl('http://localhost:57697/chat')
        .build();

    this.hubConnection
        .start()
        .then(() => this.table())
        .catch(err => console.log('Error while establishing connection :('));

    this.hubConnection.on('ReceiveMail', (mailJson: string) => {
        this.loadEmail(mailJson);
    });

    this.hubConnection.on('ReceiveConnection', (msg: string) => {
        console.log('Connection: ' + msg);
    });
}

有人对此问题有见识吗?

1 个答案:

答案 0 :(得分:1)

C#代码正在调用的方法名称与您在TS代码中正在侦听的方法不匹配-但我认为这是一个错字。如果不是,那么您需要确保.on方法使用与C#代码相同的方法名称。

您还需要更改的另一件事是在哪里开始连接E.G。

constructor() {
    this.hubConnection = new signalR.HubConnectionBuilder()
        .withUrl('http://localhost:57697/chat')
        .build();

    this.hubConnection.on('RetrieveMail', (mailJson: string) => {
        this.loadEmail(mailJson);
    });

    this.hubConnection.on('ReceiveConnection', (msg: string) => {
        console.log('Connection: ' + msg);
    });

    this.hubConnection
        .start()
        .then(() => this.table())
        .catch(err => console.log('Error while establishing connection :('));
}

在上面的代码中,我将.start()调用转移到注册on方法之后。您应该采用这种方式,因为hubconnection可以在注册处理程序之前引起争用条件之前开始侦听消息。如果on处理程序尚未完成注册,则不会接收任何发送的消息。