首页 文章

如何从Hub外部向Hub组添加SignalR连接?

提问于
浏览
0

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

在我的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 回答

  • 1

    据我所知,您希望将连接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");
        }
    }
    

相关问题