W najnowszej wersji Asp.Net SignalR został dodany nowy sposób wysyłania wiadomości do określonego użytkownika, przy użyciu interfejsu „IUserIdProvider”.
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Moje pytanie brzmi: Skąd mam wiedzieć, do kogo wysyłam wiadomość? Wyjaśnienie tej nowej metody jest bardzo powierzchowne. A wersja robocza instrukcji SignalR 2.0.0 z tym błędem i nie kompiluje się. Czy ktoś zaimplementował tę funkcję?
Więcej informacji: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Uściski.
Odpowiedzi:
SignalR zapewnia ConnectionId dla każdego połączenia. Aby dowiedzieć się, które połączenie należy do kogo (użytkownika), musimy utworzyć mapowanie między połączeniem a użytkownikiem. Zależy to od tego, jak identyfikujesz użytkownika w swojej aplikacji.
W SignalR 2,0 odbywa się to przy użyciu wbudowanego
IPrincipal.Identity.Name
, czyli identyfikatora zalogowanego użytkownika ustawionego podczas uwierzytelniania ASP.NET.Jednak może być konieczne zmapowanie połączenia z użytkownikiem przy użyciu innego identyfikatora zamiast używania Identity.Name. W tym celu ten nowy dostawca może być używany z niestandardową implementacją do mapowania użytkownika z połączeniem.
Przykład mapowania użytkowników sygnalizujących na połączenia przy użyciu IUserIdProvider
Załóżmy, że nasza aplikacja używa znaku
userId
do identyfikacji każdego użytkownika. Teraz musimy wysłać wiadomość do konkretnego użytkownika. MamyuserId
imessage
, ale SignalR musi również znać mapowanie między naszym userId a połączeniem.Aby to osiągnąć, najpierw musimy stworzyć nową klasę, która implementuje
IUserIdProvider
:Drugim krokiem jest poinformowanie sygnalizującego, aby używał naszej
CustomUserIdProvider
zamiast domyślnej implementacji. Można to zrobić w pliku Startup.cs podczas inicjowania konfiguracji koncentratora:Teraz możesz wysłać wiadomość do określonego użytkownika, używając jego,
userId
jak wspomniano w dokumentacji, na przykład:Mam nadzieję że to pomoże.
źródło
app.MapSignalR();
przed uwierzytelnieniem wstawiłem global.asax.Oto początek .. Otwartość na sugestie / ulepszenia.
serwer
JavaScript
(Zwróć uwagę, jak
addChatMessage
isendChatMessage
są również metody w kodzie serwera powyżej)Testowanie
źródło
Oto jak użyj SignarR, aby dotrzeć do konkretnego użytkownika (bez korzystania z żadnego dostawcy):
źródło
contextIdClient
nie rozumiem :(Spójrz na testy sygnalizujące dla funkcji.
Test „SendToUser” automatycznie pobiera tożsamość użytkownika przekazaną przy użyciu zwykłej biblioteki uwierzytelniania owin.
Scenariusz jest taki, że masz użytkownika, który połączył się z wielu urządzeń / przeglądarek i chcesz przesłać wiadomość do wszystkich jego aktywnych połączeń.
źródło
Stary wątek, ale właśnie natrafiłem na to w próbce:
źródło