【问题标题】:Access SignalR Hub Context.Items from an singleton service in ASP.NET Core从 ASP.NET Core 中的单例服务访问 SignalR Hub Context.Items
【发布时间】:2021-04-10 15:23:05
【问题描述】:

我正在尝试对一个大表的 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);

我能否以某种方式从其他类访问 Hub 的 Context.Items 字典?

【问题讨论】:

    标签: c# asp.net-core .net-core signalr


    【解决方案1】:

    我是否能够以某种方式从其他类访问 Hub 的 Context.Items 字典?

    没有。

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

    【讨论】:

      【解决方案2】:

      我似乎无法通过此引用访问 Hub 的 Context.Items 属性

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

      看来你访问的是HttpContext.Items,而不是你在hub方法中设置的HubCallerContext.Items

      请注意,HubCallerContext 是用于访问集线器调用者连接信息的上下文抽象,没有调用者与集线器类之外的自定义/单例服务中的调用相关联,因此您无法通过以下方式获取数据来自 Hub 类外部的 HubCallerContext.Items 属性。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多