Как добавить соединение SignalR в группу Hub извне Hub? - PullRequest
0 голосов
/ 25 июня 2018

Прежде чем начать, я хочу упомянуть, что это не совсем дубликат, на другие подобные вопросы нет полезных ответов для моего случая.

В моем ASP.Net Core 2.1 у меня есть действие, которое можно вызвать с помощью AJAX (его имя CreateConversation).

В этом приложении у меня есть активное соединение SignalR для каждого пользователя в моем приложении (таким образом, соединение начинается, когда пользователь обновляет / перемещается по странице).

Когда это действие вызывается с использованием AJAX (пользователь нажал на какую-то кнопку на странице), я хочу добавить это соединение к определенной группе моего Hub. Проблема здесь, чтобы иметь возможность добавить соединение в группу концентраторов из контроллера, мне нужен доступ к идентификатору этого соединения из HubCallerContext), и этот идентификатор недоступен за пределами концентратора.

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

До сих пор я ни разу не указывал Id соединения с хабом вручную (пока мне это не нужно). Сохранение HubCalledContext.I необходимо для решения этой проблемы? или есть ли лучший подход в решении этого? Я думал о том, чтобы сохранить его в сеансах, например, но у меня нет доступа к HttpContext в SignalR. Я ценю любое оптимальное предложение, чтобы иметь возможность добавить свое подключение к требуемой группе концентраторов извне самого концентратора.

1 Ответ

0 голосов
/ 25 июня 2018

Насколько я понимаю, вы хотите добавить идентификатор подключения к любой группе в контроллере

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