2012-05-18 12 views
7

Patrzę na SignalR dla projektu, nad którym pracuję, i wydaje mi się, że to DOKŁADNIE to, czego chcę. Jednak jeden bit, który wciąż jestem nieco zdumiony, to grupy i dołączenie.SignalR i dołączanie do grup

Spróbuję najpierw opisać kontekst wdrożenia. Zatem użytkownik w ramach istniejącego systemu będzie chciał zorganizować spotkanie dotyczące danego tematu, a następnie utworzy pokój o podanej nazwie/identyfikatorze, zaprosi do niego innych, a następnie będzie w zasadzie jak prywatny czat.

Tak więc kroki, które zakładam, byłyby gospodarzem, tworzą pokój i dołączają do niego, a następnie wysyłają zaproszenia, które wymagałyby od użytkowników kliknięcia, które w jakiś sposób powiedzieliby serwerowi, do którego pokoju się przyłączyć.

Teraz widzę z dokumentacji, że istnieje metoda dołączania i rozłączania, do której można się podłączyć, aby umieścić kogoś w grupie, jednak wydaje się, że Join nie ma powiązanego z nią kontekstu innego niż ciąg zapytania, więc Jestem nieco zdezorientowany co do tego, co wywołuje Join, ponieważ spodziewałbym się, że będzie to ręcznie uruchamiana metoda na kliencie przechodząca nad jakimś kontekstem podającym obiekt, co do miejsca, w którym można je umieścić, ponieważ możesz mieć setki prywatnych pokoi.

Jak więc podać metodę Join w pewnym kontekście i rozłączyć jeden, aby wiedział, do jakiego pomieszczenia chcesz dołączyć, tak jakby nie był uruchamiany ręcznie, jak ustawić ciąg zapytania, a jeśli jest ustawiony ręcznie wywołane, dlaczego nie można wysyłać niestandardowego obiektu. tj

public Task Join() 
{ 
    var groupName = Context.QueryString["some-room-identifier"]; 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

vs

public Task Join(string groupName) 
{ 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

Więc ja czegoś brakuje lub jest jakiś sposób, aby dać kontekst do łączenia użytkownika, aby umieścić je w miejscu właściwym czasie pierwszego?

Odpowiedz

8

Miałem prawie takie samo doświadczenie jak ty i pracowałem/przedzierałem się przez to, więc podzielę się tym, co zrobiłem.

Musisz uchwycić gdzieś stan. Sprawdź wiki SignalR Hubs pod nazwą https://github.com/SignalR/SignalR/wiki/Hubs pod hasłem Roundtripping from Client to Server. Zauważyłem, że jest to przydatne, ponieważ informuje o tym, jak ustawić stan na koncentratorze lub kliencie serwera i pobrać go na drugim końcu.

Doszedłem do tego samego wniosku co ty, że Join jest ręcznie wyzwalane przez jakieś wydarzenie. Używam ankiety, aby sprawdzić, czy ktoś poprosił o czat z użytkownikiem. Rzeczywiście można przesunąć z serwera (patrz SignalR Join Group From Controller), co oznacza, że ​​działanie kontrolera, który obsługuje dodawanie nowej wiadomości czatu można nazwać piasty za Join metody:

// join chatroom 
public Task Join(dynamic mygroup) 
{ 
var groupName = groupy.GetGroupName(parent.userId, (int)mygroup.userIdTo); 
return Groups.Add(Context.ConnectionId, groupName); 
} 

Dla moich nazw grup, używam Singleton do generowania i śledzić nazwy przy użyciu Dictionary<string, int[]> (int[] dla identyfikatorów użytkownika).

W przypadku stanu klienta, skończyłem tworzyć niestandardowy obiekt JavaScript, który zarządzał nazwą grupy, w ten sposób ...

Chat.Chatgroup = function (groupId, userIdTo) { 
this.GroupId = groupId; // our group's title/id 
this.UserIdTo = userIdTo; // who the other user is 
} 

Potem wywołać metodę signalR po podłączeniu

onechat.getOurGroup(mygroup) // invoke method on server 
.done(function (response) { 
mygroup = response; 
/* + whatever else you need to do*/ }); 

Teraz można ustawić stan na serwerze i utrzymać ten stan na kliencie:

public dynamic GetOurGroup(dynamic mygroup) 
{ 
var ourId = groupy.GetGroupName(parent.userId, (int)mygroup.UserIdTo); 
mygroup.GroupId = ourId;      
return mygroup; 
} 

nadzieję, że przynajmniej niejasno pomocny!

+0

Dziękuję za wszystkie przydatne rzeczy, ale nie będę na nie odpowiadał, ale przyznam Ci prawo do głosowania za użyteczność. Mając nadzieję, że więcej ludzi będzie dzwonić z czasem. – Grofit

+0

Tak, to nowe rzeczy, ponieważ dowiadujemy się, że dopracujemy – testpattern

+0

+1. Myślę, że jest to jedyny sposób, z którym należy się zgodzić, biorąc pod uwagę, że SignalR nie zapewnia interfejsu API, który zwraca nazwę grupy, podając identyfikator połączenia. – GETah