Сигнал R и AJAX не получают обновления от API - PullRequest
0 голосов
/ 18 февраля 2020

Поэтому я следовал этому короткому руководству с сайта MS по созданию приложения SignalR: Приложение SignalR

Я бы подумал, что смогу использовать локальный API для наблюдения за изменением счетчика после добавив строку к нему в режиме реального времени. Я использовал AJAX для этого:

function getALL() {
  $.ajax({
    url: 'http://localhost:8080/api/GetCount',
    contentType: 'application/json ; charset:utf-8',
    type: 'GET',
    success: function (data) {
        console.log(data);
        document.getElementById("messageList").innerHTML = data[0].Count;
    }
  });
}

Конечно, инициированный хаб с: var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

connection.on("ReceiveMessage", function () {
  getALL();
});

connection.start().then(function () {
  getALL(); 
  connection.invoke("SendMessage").catch(function (err) {
    return console.error(err.toString());
});
}).catch(function (err) {
  return console.error(err.toString()); 
});

Теперь приведенный выше код работает и показывает мне данные в первый раз, но когда я добавляю еще одну строку, ничего не происходит. Что мне не хватает? Событие onclick в примере MS работает. Но нет, если я попытаюсь загрузить его без событий.

Мой концентратор:

    public class ChatHub : Hub
    {
        private IHubContext<ChatHub> _hubContext;

        public ChatHub(IHubContext<ChatHub> hubContext) { _hubContext = hubContext; }

        public async Task SendMessage()
        {
            await _hubContext.Clients.All.SendAsync("ReceiveMessage");
        }
    }
}

Я добавляю AJAX в неправильном месте? В моем хабе отсутствует Модель сущности? Если да, то почему, когда я вызываю локальный API.

Я также загрузил концентратор в файл Startup.cs, как советовалось:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chatHub");
            endpoints.MapFallbackToPage("/_Host");
        });

Я пытаюсь сделать это с помощью net Core 3.1. Любые предложения полезны. Я думал, что это будет простой пример для модификации, но мне пока не повезло. Спасибо всем.

1 Ответ

1 голос
/ 18 февраля 2020

Вы должны получать уведомление о концентраторе, когда происходит такое изменение:

connection.invoke("SendMessage").catch(function (err) {
    return console.error(err.toString());
});

И вам это нужно не после запуска соединения, а после каждого добавления строки. Редактировать: Чтобы показать вам немного того, что нужно: 1. Вам нужно событие в сигнале-клиенте, где добавляется строка и запускается код перед этим. 2. Вам нужен (второй или такой же) сигналR-клиент, который уведомлен, как у вас уже есть.

Вы не сможете увидеть изменения в базе данных, если только добавите строку напрямую. Вы должны добавить строку в Frontensegeln и уведомить концентратор в своем клиентском приложении.

...