2012-04-10 22 views
6

Pracuję nad aplikacją, która musi powiadomić użytkownika, gdy otrzyma nowe powiadomienie. Aplikacja będzie hostowana na platformie Azure i będzie .NET MVC 3 (prawdopodobnie nie jest to ważna, ale na pewno). TeżWysyłanie powiadomień PushalR do wszystkich instancji przeglądarki pojedynczego uwierzytelnionego użytkownika

Powiadomienia są zapisywane w MSSQL db (2008) i mają pole IsRead. Powiadomienia generowane są z różnych działań użytkownika i serwera. Na podstawie preferencji użytkownika niektóre powiadomienia będą tworzone z numerem IsRead == false.

mam 2 różne scenariusze, że czuję, że SignalR będzie idealny w obsłudze, po prostu trzeba trochę wskazówek:

  1. Użytkownik ma kilka otwartych oknach przeglądania strony i nowe powiadomienie wiersz dodaje przypisany do tego użytkownika, z IsRead == true
    • Chciałbym wszystkie instancje przeglądarki konkretnego użytkownika, aby mieć określoną funkcję js nazwie ujawnić powiadomienie pop-up
  2. użytkownik ma kilka wiatr Otwiera się i klika powiadomienie pop-up.
    • Chciałbym, aby wszystkie instancje przeglądarki określonego użytkownika wywoływały określoną funkcję js, aby usunąć wyskakujące powiadomienie. (Jedynie specyficzny przykład przeglądarka obsługiwane kliknięcie będzie również wykonać funkcję js, aby pokazać szczegóły powiadomień)

Co Próbowałem


Na pierwszym scenariuszu, myślę że to samo działanie, które powoduje zapisanie powiadomienia w bazie danych, będzie odpowiedzialne za powiadamianie o wszystkich instancjach przeglądarki użytkownika.

Drugi scenariusz byłby podobny do tego, klikając w pop-up, punkt końcowy serwera byłby wywoływany przez Ajax i ten punkt końcowy aktualizowałby bazę danych, aby oznaczyć powiadomienie jako przeczytane, a następnie powiadamiał wszystkie wystąpienia przeglądarki innych użytkowników. .

Jeśli istnieje sposób na śledzenie klientów SignalR w oparciu o nazwę użytkownika ASP.NET Forms Username, to myślę, że będzie działać w celu rozwiązania problemów w obu scenariuszach.

TL; DR


Moim głównym problemem jest to, że nie wiem, jak do sygnalizowania wszystkich przypadkach przeglądarek jednego konkretnego użytkownika Korzystanie SignalR. Zastanawiałem się nad utworzeniem grupy opartej na nazwie użytkownika ASP.NET Forms Authentication. Czy to działa? Czy istnieje łatwiejszy sposób, który jest wbudowany w SignalR, który to obsługuje?

Odpowiedz

15

Twoje wezwanie do utworzenia Grupy z Nazwą użytkownika jako kluczem jest dobre i myślę, że jest to najszybsze do wdrożenia.Można wywołać funkcję każdym razem, gdy strona ładuje (i ConnectionId zmienianych) poprzez zapisanie się na:

$.connection.hub.start(function() { 
    yourHub.register(); 
}); 

A w piaście w kodzie za:

public void Register() 
{ 
    AddToGroup(username); 
} 

A kiedy chcesz odśwież ekrany klienta zrobić:

Clients[username].refreshClientScreen(); 

Gdzie refreshClientScreen() jest JavaScript funkcja, która wykonuje ukrywanie powiadomienia w przeglądarce.

Innym sposobem, aby to zrobić, jest sprawdzenie ConnectionId przy każdym żądaniu i mieć miejsce, w którym rejestrujesz i utrzymuje połączenia użytkownika na serwerze. Kiedy trzeba ich aktualizacji można użyć tego kodu na każdej z nich:

Clients[ConnectionId].refreshClientScreen(); 

można znaleźć ConnectionId w Context przedmiotu koncentratora.

myślę drugie podejście jest trudniejsze do wdrożenia, ponieważ trzeba zarządzać, gdzie chcesz zapisać ConnectionId -s i subskrybować przypadku rozłączenia poprzez wdrożenie IDisconnect więc można zachować swój ConnectionId -s listę w górę do tej pory, więc wybrałbym pierwsze podejście - to z grupami.

+0

Dziękuję za komentarz. Wypróbuję to i zobaczę jak to działa! –

+0

To zadziałało świetnie! Dzięki :) –

Powiązane problemy