簡體   English   中英

訪問 SignalR 集線器上下文。來自 ASP.NET 核心中 singleton 服務的項目

[英]Access SignalR Hub Context.Items from an singleton service in ASP.NET Core

我正在嘗試對大表的 signalR 廣播進行分頁,以便每個訂閱的組都有一個用戶可以看到的“當前頁面”。 我希望頁碼的 state 存在於集線器的 Context.Items 字典中。

在我的集線器中,我這樣設置頁碼:

public class OnlineBotsHub : Hub
{
    public async Task JoinGroup(string num)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, num);
        await Clients.Group(num).SendAsync("AddedToGroup", "added to group number: " + num);
    }

    public void Pagination(string pageNum)
    {
        Context.Items.Add("page", pageNum);
    }
}

目前,我將集線器注入到 singleton 服務中,如下所示:

private readonly IHubContext<OnlineBotsHub> _hub;
public OnlineBotService(IHubContext<OnlineBotsHub> hub)
{
    _hub = hub;
}

但我似乎無法通過此引用訪問集線器的 Context.Items 屬性。 我想在 singleton 服務中使用這個值,如下所示:

Context.Items.TryGetValue("page", out object currentPage);
var returnList = PagedList<T>.ToPagedList(addBots.OrderBy(x => x.RowId), currentPage, 100);

我是否能夠以某種方式從其他 class 訪問集線器的 Context.Items 字典?

我是否能夠以某種方式從其他 class 訪問集線器的 Context.Items 字典?

不。

相反,您應該擁有一個服務,該服務包含您的 Hub 和 OnlineBotService 都可以訪問和使用的組信息。

我似乎無法使用此引用訪問集線器的 Context.Items 屬性

Context.Items.TryGetValue("page", out object currentPage);

您似乎正在訪問HttpContext.Items ,而不是您在集線器方法中設置的HubCallerContext.Items

請注意, HubCallerContext是用於訪問集線器調用方連接信息的上下文抽象,在您的集線器 class 之外的自定義/單例服務中沒有與調用關聯的調用方,因此您無法通過HubCallerContext.Items屬性從在集線器 class 之外。

如果可能的話,您可以嘗試在您的集線器方法中將數據保存在某個緩存存儲中,然后您可以從 singleton 服務中的緩存存儲中獲取數據。

暫無
暫無

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

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