从 ASP.NET Core 中的单例服务访问 SignalR Hub Context.Items

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

我正在尝试对大型 table 的 signalR 广播进行分页,以便每个订阅的组都有一个用户可以看到的“当前页面”。我希望页码的状态存在于 Hub 的 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);
    }
}

目前我像这样将我的集线器注入单例服务:

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

但我似乎无法使用此引用访问 Hub 的 Context.Items 属性。 我想在这样的单例服务中使用这个值:

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

我能以某种方式从另一个 class 访问集线器的 Context.Items 字典吗?

Am I able to access the Hub's Context.Items dictionary from this other class somehow?

没有

您应该有一个服务来保存您的 Hub 和您的 OnlineBotService 都可以访问和使用的组信息。

I cannot seem to access the Hub's Context.Items property with this reference

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

您似乎正在访问 HttpContext.Items,而不是您在 hub 方法中设置的 HubCallerContext.Items

请注意,HubCallerContext 是一个上下文抽象,用于访问有关集线器调用者连接的信息,没有调用者与集线器外部的 custom/singleton 服务中的调用相关联 class,因此您无法通过 HubCallerContext.Items 属性 从 Hub class.

外部获取数据

如果可能,您可以尝试在您的 hub 方法中将数据保存在某些缓存存储中,然后您可以从缓存存储中获取存储在您的单例服务中。