簡體   English   中英

如何在 ASP.NET Core 2.2 中使用來自不同托管項目的共享 SignalR Hub

[英]How to use shared SignalR Hub from different hosted project in ASP.NET Core 2.2

我正在處理一個使用 ASP.NET Core 2.2 構建的項目。 主要解決方案包含多個項目,其中包括API、web和其他類庫。

我們使用 SignalR 來顯示 API 項目和 Web 項目之間的共享消息/通知。 例如,從 API 添加新員工記錄應該調用 SignalR Hub,並且所有 Web 客戶端都應該收到通知。

這是我們項目的當前結構

|- 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);
    }
}

Web啟動類:

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 代碼中獲取連接 ID 和狀態“已連接”,但是,網絡仍然沒有收到任何通知。 還嘗試了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();

在此處輸入圖像描述

對於這種情況,您最好使用發布/訂閱系統,例如 rabbitmq、kafka、akka.net、redis。 但是,如果您堅持使用 signalr,最好的解決方案是使用 signalr 創建一個消息協調器並使其成為 signalr 主機,然后您的其他服務將充當客戶端,將它們的消息發送到該 signalr 服務並從該服務接收消息(您甚至可能需要實現一些邏輯來讓你的按摩協調器對消息進行排隊並使它們持久化)此外,如果你可以遷移到 asp.net core 3,你應該最終檢查 grpc 雙向流,這可能是一個完美的解決方案你的問題。

您可以將 HubContext 注入 API 項目中的控制器並嘗試點擊“InvokeAsync”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM