2012-02-27 1 views
11

Я хочу реализовать систему напоминаний в Facebook как ASP.NET MVC 3: уведомления отправляются конкретному пользователю, чтобы уведомить его о действии на одном из своих предметов.Использовать Signalr, чтобы иметь фейсбук, такой как система уведомлений

Является ли signalr подходящим для такого требования? Как я могу отправить уведомление конкретному пользователю (все открытые сеансы этого пользователя) с помощью SignalR?

Редактировать

Хорошо, вот что я сделал

В стороне клиента

$(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); 
}); 

}); 

В стороне сервера

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

И каждый раз, когда мне нужно, чтобы уведомить пользователя в контроллере я делаю следующее:

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

ответ

2

Это подходит для этого или вы используете опрос, это два варианта.

Heres совершенно новое видео с сегодняшнего дня на этом:

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

+0

thx Адам, как вы думаете, решение, которое я разместил в конце моего шкала сообщений хорошо? Thx – hichn

+0

Ваш контроллер должен принять IConnectionManager в качестве вложенной зависимости в свой контроллер. Вы не должны называть Resolve() действительно в другом месте, кроме фабрики контроллера. Используйте некоторый контейнер DI (единство, например - unit.mvc3 nuget), и используйте инъекцию конструктора для ввода в ваш контроллер. Убедитесь, что у вас есть метод Dispose для конкретной реализации IConnectionManager, который вы сообщаете единству, чтобы избавиться от него, когда это делается с помощью HierarchicalLifetimeManager. Установите точку останова для обеспечения вызова вызова (только если вы реализуете IDisposable) –

3

Да, SignalR - хороший выбор для этого. Взгляните на документацию относительно концентраторов (server и JS client).

Вам необходимо реализовать логику сервера, чтобы связать сеанс вашего клиента с сеансом SignalR. Вы можете использовать группы для уведомления обо всех открытых сеансах каждого пользователя.

+0

@ user1236014 Когда пользователь подключается вам нужно добавить его SignalR сессии к группе с его именем пользователя/идентификатором. Каждый раз, когда вам нужно уведомить пользователя, вы просто передаете сообщение своей группе (это гарантирует, что все открытые сессии будут уведомлены). Взгляните на этот пример, это может помочь вам: http://blog.maartenballiauw.be/post/2011/12/06/Using-SignalR-to-broadcast-a-slide-deck.aspx – nmat

+0

thx nmat, решение, которое я написал в своем сообщении, отлично работает. Как вы думаете, это лучше? как вы думаете, он весит хорошо? – hichn

Смежные вопросы