Я работаю с проектом, построенным с 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();