2012-02-27 60 views
11

我想在ASP.NET MVC 3中實現一個類似facebook的通知系統:通知被髮送給特定用戶,通知他對他的某個項目的操作。使用Signalr有一個類似facebook的通知系統

信號器是否適合這種要求? 如何使用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

這是適當的或你使用民意測驗,這是兩個選擇。

繼承人從今天起一個全新的視頻在此:

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 2012-03-01 15:10:59

+0

您的控制器應將IConnectionManager作爲注入的依賴項放入其控制器中。除了控制器工廠外,您不應該在其他任何地方調用Resolve()。使用一些DI容器(例如統一 - unity.mvc3 nuget包)並使用構造器注入來注入你的控制器。確保在IConnectionManager的具體實現中有Dispose方法,當通過使用HierarchicalLifetimeManager完成時告訴單元處理它。設置一個斷點來確保dispose被調用(只有當你正在實現IDisposable時) – 2012-03-01 15:59:50

3

是的,SignalR是一個不錯的選擇。查看有關集線器的文檔(serverJS client)。

您需要實現服務器邏輯以將客戶端的會話與SignalR的會話相關聯。您可以使用組來通知每個用戶的所有打開的會話。

+0

@ user1236014當用戶連接你需要他的SignalR會話添加到組與他的用戶名/標識符。每次您需要通知用戶時,您只需向他的小組廣播一條消息(這樣可以保證所有公開會話都會得到通知)。看看這個例子,它可能會幫助你:http://blog.maartenballiauw.be/post/2011/12/06/Using-SignalR-to-broadcast-a-slide-deck.aspx – nmat 2012-02-28 19:05:45

+0

thx nmat,the解決方案我寫在我的文章工作正常。你認爲這是更好的嗎?你認爲它比較好嗎? – hichn 2012-02-29 19:40:25