Я хочу разрешить своим пользователям подключаться к определенной группе 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);
}
}