SignalR Asp.Net Core Отправить Async Висячие - PullRequest
0 голосов
/ 26 июня 2018

Так что это произошло во второй раз сейчас. Я полагаю, что ошибка вызвала, когда я попытался обновить мой сервер MongoDb, но я до сих пор не знаю, почему это происходит, и я хотел бы узнать.

Обычно я отправляю данные строки json из скрипта C # на мой интерфейс с помощью Signalr с помощью этой команды:

_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 голосов
/ 27 июня 2018

Имя метода, вызываемого кодом 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 не завершил регистрацию.

...