Как использовать общий SignalR Hub из другого размещенного проекта в ASP. NET Core 2.2 - PullRequest
4 голосов
/ 21 января 2020

Я работаю с проектом, построенным с ASP. NET Core 2.2. Основное решение содержит несколько проектов, в том числе API, веб-библиотеки и другие библиотеки классов.

Мы использовали SignalR для отображения общих сообщений / уведомлений между проектом API и веб-проектом. Например, добавление новой записи сотрудника из API должно вызвать SignalR Hub, и все веб-клиенты должны получить уведомление.

Вот текущая структура нашего проекта

|- API
|- Hub_ClassLibrary
|- Services
|- Web

Поток:

Web > services > Hub 
API > services > Hub

Концентратор:

public class NotificationHub : Hub
{
    public async Task SendNotification(List<DocumentHistoryModel> notifications)
    {
        await Clients.All.SendAsync(Constants.ReceiveNotification, notifications);
    }
}

Класс веб-запуска:

app.UseSignalR(routes =>
{
    routes.MapHub<NotificationHub>("/notificationHub");
});

Класс запуска API

app.UseSignalR(routes =>
{
    routes.MapHub<NotificationHub>("/notificationHub");
});

Служба

private readonly IHubContext<NotificationHub> _hubContext;

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

await _hubContext.Clients.All.SendAsync(ReceiveNotification, notifications);

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

Редактировать: Я могу получить идентификатор соединения и состояние "подключен "в этом коде API, однако, веб все еще не получает никакого уведомления. Также пробовал connection.InvokeAsync

var connection = new HubConnectionBuilder()
     .WithUrl("https://localhost:44330/notificationhub")
     .Build();

connection.StartAsync().ContinueWith(task =>
{
    if (task.IsFaulted)
    {                    
    }
    else
    {                    
        connection.SendAsync("UpdateDashboardCount", "hello world");
    }
}).Wait();

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

вы можете добавить ваш HubContext в ваш контроллер в проекте API и попробовать нажать 'InvokeAsyn c'

0 голосов
/ 02 февраля 2020

Для этого senario лучше использовать системы pub / sub, такие как rabbitmq, kafka, akka. net, redis. Однако, если вы настаиваете на использовании сигнализатора, лучшим решением было бы создать координатор сообщений с сигнализатором и сделать его хостом для сигнализатора, и тогда ваши другие службы будут действовать как клиенты, которые отправляют свои сообщения этой службе сигнализатора и получают сообщения от этого (вы может даже потребоваться реализовать некоторую логику c для того, чтобы ваш координатор массажа помещал в очередь сообщения и делал их постоянными) Кроме того, если вы можете перейти на asp. net core 3, вам обязательно нужно проверить grp c bi-directional потоковое вещание, которое может стать идеальным решением вашей проблемы.

...