SignalrR HubConnection игнорирует параметр запроса - PullRequest
2 голосов
/ 19 января 2020

Я хочу разрешить своим пользователям подключаться к определенной группе c в моем хабе SignalR, для этого я генерирую уникальный идентификатор, которым пользователи в этой группе могут поделиться с другими. Как только пользователь подключается к концентратору, генерируется идентификатор. При «подключенном» событии их URL обновляется уникальным идентификатором. Когда я затем использую URL-адрес для присоединения к недавно созданной комнате, создается впечатление, что отправляются два запроса на согласование, оба с идентификатором группы, а также с идентификатором подключения пользователей, но иногда (не всегда) я получаю ответ от концентратора, содержащего вновь созданная группа.

Является ли параметр ?pod, который я передаю в URL, не всегда присваиваемым до выполнения запроса?

Мне кажется, что это совершенно случайно, но, скорее всего, какая-то ошибка, которую я допустил в мой код подключения, так как я относительно новичок в Angular.

Этот запрос выполнен правильно, и я присоединился к нужной комнате.

Правильное поведение

Это произошло неправильно, и была сгенерирована новая комната, хотя, похоже, (?) Запрос выглядит одинаково, за исключением подключения через веб-сокет, содержащего "pid".

Неверное поведение

Любая помощь будет принята с благодарностью!

Код для компонента Home, с которого установлено соединение

export class HomeComponent implements OnInit, OnDestroy{

  welcomeMessage:string;

  podId:string;
  users:User[];

  constructor(private signalrService: SignalRService, private  http: HttpClient, private activeRoute: ActivatedRoute,
              private router: Router, private location: Location) {}

  ngOnInit() {
    this.activeRoute.queryParams.subscribe(params => {
      this.podId = params['pod'];
      this.connectToPod();
    });
  }

  ngOnDestroy(): void {
  }

  connectToPod(){
    this.signalrService.startConnection(this.podId);
    this.signalrService.addPodConnectedLisener((data: Pod) => {

      this.podId = data.id;
      this.users = data.users;

      this.location.replaceState('/?pod=' + this.podId)
      this.welcomeMessage = window.location.origin + '/?pod=' + this.podId;
    });
  }
}

код для услуги SignalR

export class SignalRService {

  private hubConnection: signalR.HubConnection;
  private baseUrl = environment.apiUrl;

  constructor() { }

  public startConnection (podId?: string) {

    let idToSend = podId == undefined ? '' : '?pid=' + podId;

    this.hubConnection = new signalR.HubConnectionBuilder()
                              .withUrl(this.baseUrl + '/pod' + idToSend)
                              .build();

    this.hubConnection
      .start()
      .then(() => console.log('Connection started'))
      .catch(err => console.log('Error while starting connection: ' + err));
  }

  public addPodConnectedLisener (connectedCallback: Function) {
    return this.hubConnection.on('connected', data => {
      connectedCallback(data);
    });
  }
}

код для концентратора SignalR

    public class PodHub : Hub
    {
        private readonly IPodConnectionManger _podConnectionManager;

        public PodHub(IPodConnectionManger podConnectionManager)
        {
            _podConnectionManager = podConnectionManager;
        }

        public override async Task OnConnectedAsync()
        {
            var podId = Context.GetHttpContext().Request.Query["pid"].ToString();
            if (string.IsNullOrEmpty(podId))
            {
                await CreatePod();
            }
            else
            {
                await JoinPod(podId);
            }
        }

        private async Task CreatePod()
        {
            var newPodId = await _podConnectionManager.AddPod();
            var podToSend = await _podConnectionManager.GetPod(newPodId);

            await podToSend.AddUser(Context.ConnectionId);
            await Groups.AddToGroupAsync(Context.ConnectionId, podToSend.Id);
            await Clients.Group(podToSend.Id).SendAsync("connected", podToSend);
        }

        private async Task JoinPod(string id)
        {
            var podToJoin = await _podConnectionManager.GetPod(id);

            await podToJoin.AddUser(Context.ConnectionId);
            await Groups.AddToGroupAsync(Context.ConnectionId, podToJoin.Id);
            await Clients.Group(podToJoin.Id).SendAsync("connected", podToJoin);
        }
}
...