Установка собственного идентификатора при запуске ядра signalR - PullRequest
2 голосов
/ 07 октября 2019

Я создаю приложение, которое включает в себя сеанс клиента и администратора 1: 1. Я использую opentok для связи клиента с администратором и создания уникального идентификатора для их сеанса. Будет несколько сеансов клиент: администратор, но каждый сеанс должен быть уникальным.

Я использую React и asp.net core 3.

Я хочу иметь возможность иметь частное соединение Signal Rмежду заказчиком и администратором. Настройки авторизации не установлены, все они основаны на уникальном идентификаторе, который им будет дан в строке запроса.

В настоящее время я подключаюсь к Сигналу R в React следующим образом:

import { HubConnectionBuilder } from '@aspnet/signalr';
import { useState, useEffect } from "react";
import config from "config.js";

export default function useSignalR() {
    const [hubConnection, setHubConnection] = useState(null);  

    useEffect(() => {
        //ideally ill supply the connection a guid here
        let connectionBuilder = new HubConnectionBuilder()
            .withUrl(config.signalRServerUrl)
            .build();

        setHubConnection(connectionBuilder);
        connectionBuilder.start()
            .then(() => console.log("signalr connection started"))
            .catch((err) => console.log("Error while establishihng connection ", err));
    }, []);

    return hubConnection;
}

theадминистратор и клиент используют одну и ту же функцию для подключения к центральному сигнальному концентратору asp.net, который в данный момент выглядит следующим образом:

public class PhotoHub : Hub
{
    public async Task TakeSnapShot()
    {
        await Clients.All.SendAsync("takeSnapShot");
    }
}

Я думаю, это будет выглядеть примерно так:

только псевдокод

 //in javascript connection
  let connectionBuilder = new HubConnectionBuilder()
        .withProperty(uniqueId)   //pseudo code
        .withUrl(config.signalRServerUrl)
        .build();

<- на сервере ниже ->

public class PhotoHub : Hub
{
    public async Task TakeSnapShot(uniqueId)
    {
       var clientsInSession = Clients.where(customId == uniqueId); //pseudo code  
       foreach (var client in clientsInSession){
           await client.SendAsync("takeSnapShot");   //pseudo code
       }
    }
}

1 Ответ

1 голос
/ 07 октября 2019

SignalR уже предоставляет уникальный идентификатор соединения, когда вы подключаетесь к концентратору, используя этот код в своем концентраторе

    public string GetConnectionId()
    {
        return Context.ConnectionId;
    }

Таким образом, вы можете звонить вот так

 var connection = new signalR.HubConnectionBuilder().withUrl("/connectionHub").build();

        connection.start().then(function () {
            console.log("connected");

            connection.invoke('getConnectionId')
                .then(function (connectionId) {
                    console.log(connectionId)
                }).catch(err => console.error(err.toString()));;

        });
...