如何从集线器外部将SignalR连接添加到集线器组?

时间:2018-06-25 03:57:34

标签: asp.net asp.net-core signalr signalr-hub asp.net-core-signalr

在开始之前,我想提一下,这并不完全是重复的,其他类似的问题对我的情况没有任何有用的答案。

在ASP.Net Core 2.1中,我有一个可以使用AJAX调用的动作(名称为CreateConversation)。

在此应用程序中,我的应用程序上的每个用户都有一个活动的SignalR连接(因此,该连接在用户刷新/导航页面时启动)。

使用AJAX调用此操作时(用户单击页面上的某些按钮),我想将该连接添加到我的Hub的特定组中。这里的问题是,为了能够从控制器将连接添加到集线器组,我需要从HubCallerContext访问该连接的ID),并且该ID在集线器之外不可用。

public class ConversationsController
{
    public async Task<IActionResult> CreateConversation()
    {
        // How can this be made possible?
        await Groups.AddToGroupAsync(/**Context.ConnectionId**/, "SomeGroup");
    }
}

到现在为止,我还没有手动设置集线器连接的ID(我还不需要)。是否必须保留HubCalledContext.Id才能解决此问题?还是有解决这个问题的更好方法?例如,我正在考虑将其保留在会话中,但是我无法访问SignalR中的HttpContext。我非常感谢您提出最佳建议,以便能够从集线器本身之外将我的连接添加到所需的集线器组。

1 个答案:

答案 0 :(得分:1)

据我了解,您想向控制器中的任何组添加连接ID

startup.cs

g[length-1]

中心类

public void ConfigureServices(IServiceCollection services)
{
            // Inject to Hub
            services.AddScoped<ChatHub>();
}

控制器

public class Chathub : hub
{
    IHubContext<Chathub> _hubcontext;
    public ChatHub(IHubContext<Chathub> hubcontext)
    {
        _hubcontext = hubcontext;
    }

    public async Task AddToGroup(string groupName)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
    }
}