2012-02-27 7 views
11

Chcę zaimplementować system powiadamiania typu facebook jak w ASP.NET MVC 3: powiadomienia są wysyłane do konkretnego użytkownika, aby powiadomić go o akcji na jednym z jego przedmiotów.Użyj Signalr, aby mieć system powiadamiania na facebooku.

Czy sygnalizator nadaje się do takich wymagań? W jaki sposób mogę wysłać powiadomienie do określonego użytkownika (wszystkie otwarte sesje tego użytkownika) za pomocą SignalR?

Edit

Ok, Oto co zrobiłem

Na stronie klienta

$(function() { 
// Proxy created on the fly 
var chat = $.connection.chat; 
var username = '@Html.ViewContext.HttpContext.User.Identity.Name'; 
// Declare a function on the chat hub so the server can invoke it 
chat.addMessage = function (message) { 
    $('#messages').append('<li>' + message + '</li>'); 
}; 
// Start the connection 
$.connection.hub.start(function(){ 
    chat.join(username); 
}); 

}); 

Na stronie serwera

public class Chat : Hub 
{ 
    public void Join(string username) 
    { 
     AddToGroup(username); 
    } 
} 

i za każdym razem trzeba powiadomić użytkownika w kontrolerze wykonuję następujące czynności:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
dynamic clients = connectionManager.GetClients<Chat>(); 
clients[username].addMessage("test"); 

Odpowiedz

2

Jest to odpowiednie dla tego lub używasz sondowania, są to dwie opcje.

Herezje nowy film od dzisiaj na ten temat:

http://channel9.msdn.com/Shows/Web+Camps+TV/Damian-Edwards-and-David-Fowler-Demonstrate-SignalR?utm_source=dlvr.it&utm_medium=twitter

+0

thx Adam, myślisz, że rozwiązanie, które napisałem na końcu mojej skali pocztowej, dobrze? Thx – hichn

+0

Twój kontroler powinien wziąć IConnectionManager jako zależność od wstrzyknięcia do kontrolera. Nie należy wywoływać funkcji Resolve() nigdzie indziej poza fabryką sterowników. Użyj jakiegoś kontenera DI (np. Unit - unity.mvc3 nuget package) i użyj wtrysku Constructor do wstrzyknięcia do kontrolera. Upewnij się, że masz metodę Dispose na konkretnej implementacji menedżera IConnectionManager, którą chcesz przekazać jedności, aby ją zlikwidować, gdy zostanie to zrobione przy użyciu HierarchicalLifetimeManager. Ustaw punkt przerwania, aby wywoływać wywoływanie (tylko wtedy, gdy implementujesz IDisposable) –

3

Tak, SignalR jest dobrym wyborem. Zapoznaj się z dokumentacją dotyczącą koncentratorów (server i JS client).

Musisz zaimplementować logikę serwera, aby powiązać sesję klienta z sesją SignalR. Możesz użyć grup, aby powiadomić wszystkie otwarte sesje każdego użytkownika.

+0

@ user1236014 Kiedy użytkownik łączy trzeba dodać swoją sesję SignalR do grupy ze swoją nazwę użytkownika/identyfikator. Za każdym razem, gdy musisz powiadomić użytkownika, właśnie wysyłasz wiadomość do swojej grupy (gwarantuje to, że wszystkie otwarte sesje zostaną powiadomione). Spójrz na ten przykład, może to pomóc: http://blog.maartenballiauw.be/post/2011/12/06/Using-SignalR-to-broadcast-a-slide-deck.aspx – nmat

+0

thx nmat, rozwiązanie, które napisałem w moim poście, działa dobrze. Czy uważasz, że jest lepszy? myślisz, że dobrze się skaluje? – hichn