2012-02-27 25 views
11

Tôi muốn thực hiện một hệ thống thông báo giống như trong ASP.NET MVC 3: thông báo được gửi tới một người dùng cụ thể để thông báo cho anh ta về một hành động trên một trong các mục của anh ấy.Sử dụng Signalr để có hệ thống thông báo giống như Facebook

Tín hiệu có phù hợp với yêu cầu đó không? Làm cách nào để gửi thông báo đến một người dùng cụ thể (tất cả các phiên đã mở của người dùng này) bằng SignalR?

Sửa

Ok, đây những gì tôi đã làm

Ở phía client

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

}); 

Ở phía máy chủ

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

Và mỗi khi tôi cần phải thông báo cho người dùng trong bộ điều khiển tôi làm như sau:

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

Trả lời

2

Điều này thích hợp cho việc này hoặc bạn sử dụng bỏ phiếu, đó là hai lựa chọn.

Heres một thương hiệu mới video từ nay về vấn đề này:

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, bạn có nghĩ rằng giải pháp mà tôi đã đăng ở cuối bài đăng của tôi không? Thx – hichn

+0

Bộ điều khiển của bạn nên dùng IConnectionManager như một phụ thuộc được tiêm vào bộ điều khiển của nó. Bạn không nên gọi Resolve() thực sự ở bất kỳ nơi nào khác ngoài một nhà máy điều khiển. Sử dụng một số DI container (unity ví dụ - unity.mvc3 gói nuget) và sử dụng Constructor tiêm để tiêm vào bộ điều khiển của bạn. Đảm bảo nếu bạn có phương thức Vứt bỏ trên việc triển khai thực hiện cụ thể IConnectionManager của bạn mà bạn yêu cầu sự thống nhất để vứt bỏ nó khi được thực hiện bằng cách sử dụng HierarchicalLifetimeManager. Đặt điểm ngắt để đảm bảo vứt bỏ được gọi (chỉ khi bạn đang triển khai IDisposable) –

3

Có, SignalR là lựa chọn tốt cho điều đó. Hãy xem tài liệu về Trung tâm (serverJS client).

Bạn cần triển khai logic máy chủ để liên kết phiên của khách hàng với phiên của SignalR. Bạn có thể sử dụng nhóm để thông báo cho tất cả các phiên mở của mỗi người dùng.

+0

@ user1236014 Khi người dùng kết nối bạn cần phải thêm phiên SignalR của mình đến một nhóm với tên của ông/nhận dạng. Mỗi khi bạn cần thông báo cho người dùng, bạn chỉ phát một tin nhắn cho nhóm của mình (điều này đảm bảo rằng tất cả các phiên mở sẽ được thông báo). Hãy xem ví dụ này, nó có thể giúp bạn: http://blog.maartenballiauw.be/post/2011/12/06/Using-SignalR-to-broadcast-a-slide-deck.aspx – nmat

+0

thx nmat, giải pháp tôi đã viết trong bài viết của tôi hoạt động tốt. Bạn có nghĩ nó tốt hơn không? Bạn có nghĩ rằng nó quy mô tốt? – hichn

Các vấn đề liên quan