2011-10-24 35 views
55

Tôi muốn gọi cho một khách hàng cụ thể từ máy chủ và không phát sóng tới tất cả khách hàng. Vấn đề là tôi đang trong phạm vi của một số yêu cầu AJAX (trong .aspx codebehind nói), và không phải trong Hub hoặc PersistentConnection, do đó, không có tài sản khách hàng - và khách hàng đã thực hiện cuộc gọi ajax (jquery) không phải là khách hàng Tôi muốn gửi tin nhắn tín hiệu!Gọi cho khách hàng cụ thể từ SignalR

Bây giờ, tôi có một trung tâm được gọi là tải trang JS, đăng ký khách hàng mới vào danh sách tĩnh của máy chủ, vì vậy tôi có Trợ giúp khách hàng. Nhưng không biết cách sử dụng nó để gửi tin nhắn từ máy chủ đến máy khách cụ thể.

Trả lời

44
+0

Thanx! Đó là quá dễ dàng :) clientId là Context.ClientId trong Hub? ClientID có thay đổi trong mọi yêu cầu của khách hàng không, Ayende đã đề cập điều gì đó về nó trong bài đánh giá SR của anh ta, hay tôi có thể dựa vào đó như là hằng số cho mọi khách hàng? –

+3

"Client = connection" vì vậy mọi yêu cầu sẽ cung cấp cho bạn một id khách hàng mới. Trong phiên bản tiếp theo của SignalR, chúng tôi sẽ cho phép bạn ghi đè logic tạo id ứng dụng để bạn có thể liên kết nó với một thứ gì đó có liên quan hơn. Ngay bây giờ, bạn nên liên kết id ứng dụng với một cái gì đó có liên quan đến ứng dụng của bạn (như tên người dùng). – davidfowl

+0

Vì vậy, mỗi khi trang hiển thị (khi tôi bắt đầu trung tâm), tôi phải cập nhật danh sách người dùng của mình với clientId mới? –

16
$('#sendmessage').click(function() { 
    // Call the Send method on the hub. 
    chat.server.send($('#displayname').val(), $('#message').val(), $.connection.hub.id); 
    // Clear text box and reset focus for next comment. 
    $('#message').val('').focus(); 
}); 

ở phía máy chủ gửi id của khách hàng và đáp ứng với id mà

public void Send (string name , string message , string connID) 
    { 
     Clients.Client(connID).broadcastMessage(name , message); 
    } 
+4

$.connection.hub.id là 'undefined'? – ibiza

+1

Tôi nghĩ 'Clients.Client (connID)' trong 'Send()' trả về cùng một máy khách thực sự gọi hàm 'Send' để bắt đầu bằng .. có nghĩa là chức năng' Gửi' sẽ thực sự phát tin nhắn tới cùng một máy khách . Điểm là gì? – Nawaz

10

Mỗi khi bạn gửi lại truy vấn vào máy chủ trung tâm, yêu cầu của bạn sẽ có id kết nối khác, vì vậy, tôi đã thêm bảng băm tĩnh chứa tên người dùng- không thay đổi liên tục và id kết nối fro tín hiệu r, mỗi khi bạn kết nối, kết nối id sẽ được cập nhật

$.connection.hub.start().done(function() { 
    chat.server.registerConId($('#displayname').val()); 
}); 

và trong mã máy chủ:

public class ChatHub : Hub 
{ 
    private static Hashtable htUsers_ConIds = new Hashtable(20); 
    public void registerConId(string userID) 
    { 
     if(htUsers_ConIds.ContainsKey(userID)) 
      htUsers_ConIds[userID] = Context.ConnectionId; 
     else 
      htUsers_ConIds.Add(userID, Context.ConnectionId); 
    } 
} 
1

Nếu người dùng cụ thể thực sự là người gọi nó tự, bạn có thể sử dụng:

Clients.Caller.myJavaScriptClientFunction(); 
0

khi bạn muốn gửi thư đến id cụ thể

Clients.Client(Context.ConnectionId).onMessage(
       new Message{From = e.Message.From, Body = e.Message.Body} 
       ); 
Các vấn đề liên quan