Сообщения SignalR не работают при развертывании сайта - PullRequest
0 голосов
/ 20 июня 2019

Я создаю веб-сайт с использованием ASP.NET Core 2.2 и SignalR.

Основное использование SignalR - отправка уведомлений при отправке пожертвований.У меня есть запланированное задание под управлением Quartz.net, которое отправляет уведомление с последними пожертвованиями.

В запланированном задании я внедряю экземпляр IServiceScopeFactory и использую его для создания IHubContext<CampaignHub> следующим образом (нерелевантный код опущен для ясности) ...

public class DonationsNotifierJob : IJob {
  private readonly IServiceScopeFactory _scopeFactory;

  public DonationsNotifierJob(IServiceScopeFactory scopeFactory) =>
    _scopeFactory = scopeFactory;

  public async Task Execute(IJobExecutionContext context) {
    using (IServiceScope scope = _scopeFactory.CreateScope()) {
      IHubContext<CampaignHub> hubContext = scope.ServiceProvider
        .GetRequiredService<IHubContext<CampaignHub>>();
      await hubContext.Clients.All
        .SendAsync("UpdatedCampaignData", new LiveCampaignData {
          // Data loaded here...
        });
    }
  }
}

Бритва для одной из страниц, которая должна собирать уведомления, включает в себя следующий JavaScript ...

  var connection = new signalR.HubConnectionBuilder()
    .withUrl("/campaignHub")
    .build();
  connection.start();

  connection.on("UpdatedCampaignData", function(d) {
    // Code omitted for clarity
  });

Thisработает нормально, когда я работаю в Visual Studio (2017 Enterprise), но когда я развертываю сайт на тестовом сервере, страница, содержащая JavaScript выше, никогда не получает уведомления.

Я пытался добавить обычный "чат"Комнатный код, который вы видите в примерах, и он работал нормально, поэтому SignalR работает в некоторой степени.Мало того, но одна из страниц, которая отправляет уведомление SignalR напрямую (с использованием того же метода хаба, как показано выше), работает нормально, поэтому, похоже, это проблема только в запланированном задании.

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

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

Любой, кто может дать мне представление о том, как явыяснить, что происходит не так?Извините, если здесь недостаточно информации, но я не знаю, что еще вам сказать.

Спасибо

1 Ответ

0 голосов
/ 21 июня 2019

Я думаю, что вам не хватает метода invoke.Ниже приведен мой пример

(function () {
        var connection = new signalR.HubConnectionBuilder().withUrl("/connectionHub").build();

        connection.start().then(function () {
            console.log("connected");

            connection.invoke('getConnectionId')
                .then(function (connectionId) {
                    sessionStorage.setItem('conectionId', connectionId);
                    // Send the connectionId to controller
                }).catch(err => console.error(err.toString()));;


        });

        $("#sendmessage").click(function () {
            var connectionId = sessionStorage.getItem('conectionId');
            connection.invoke("Send", connectionId);
        });

        connection.on("ReceiveMessage", function (message) {
            console.log(message);
        });

    })();

И код хаба

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;

namespace SignalR.Models
{
    public class ConnectionHub : Hub
    {
        public async Task Send(string userId)
        {
            var message = $"Send message to you with user id {userId}";
            await Clients.Client(userId).SendAsync("ReceiveMessage", message);
        }

        public string GetConnectionId()
        {
            return Context.ConnectionId;
        }
    }
}

Подробнее вы можете прочитать здесь

...