2011-10-24 166 views
55

我想從服務器呼叫特定客戶端,而不是向所有客戶端廣播。問題是我處於某個AJAX請求的範圍內(在.aspx代碼隱藏的說吧),而不是在Hub或PersistentConnection中,所以沒有Clients屬性 - 以及使ajax(jquery)調用不是客戶端的客戶端我想發送信號消息!從SignalR呼叫特定客戶端

現在,我有一個集線器,它被稱爲JS頁面加載,註冊新的客戶端到服務器靜態列表,所以我有客戶端GUID。但不知道如何使用它將消息從服​​務器發送到特定的客戶端。

回答

44
+0

Thanx!這太容易了:) clientId是Hub中的Context.ClientId?客戶ID是否會在每個客戶請求中發生變化,Ayende在他的SR審覈中提到了一些情況,或者我可以依賴這一點爲每個客戶保持一致? –

+3

「客戶端=連接」,所以每個請求都會給你一個新的客戶端ID。在SignalR的下一個版本中,我們將讓您覆蓋生成客戶端ID的邏輯,以便您可以將其與更相關的內容相關聯。現在,您應該將客戶端ID關聯到與您的應用程序相關的內容(如用戶名)。 – davidfowl

+0

所以每次頁面呈現時(當我啓動集線器時),我必須用新的clientId更新我的用戶列表? –

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

在服務器端向客戶端發送和響應的ID與該id

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

$。connection.hub.id是'undefined'? – ibiza

+1

我覺得'Send()'中的'Clients.Client(connID)'返回的是實際調用Send函數的同一個客戶端,這意味着'Send'函數實際上將消息廣播到同一個客戶端。有什麼意義? – Nawaz

10

每當你發送一個re查詢中心服務器,你的請求將有不同的連接ID,所以,我添加了一個靜態哈希表,其中包含一個用戶名 - 其中 不會連續變化,並且每次連接時都會連接到信號r的連接ID連接ID將被更新

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

,並在服務器代碼:

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

如果特定用戶實際上是調用者它的自我,你可以使用:

Clients.Caller.myJavaScriptClientFunction(); 
0

當你想發送消息到特定的ID

Clients.Client(Context.ConnectionId).onMessage(
       new Message{From = e.Message.From, Body = e.Message.Body} 
       );