如何从Hub外部向Hub组添加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)

3 years ago

据我所知,您希望将连接ID添加到控制器中的任何组

startup.cs

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

调节器

public class AnyController 
{
        //if you want to access connectionId in here , add hubcontext in here too
    private readonly ChatHub _chatHub;
    public AnyController(ChatHub chatHub)
    {
        _chatHub = chatHub;
    }

    public IActionResult Index()
    {
        _chatHub.AddToGroup("groupname");
    }
}