我想從服務器呼叫特定客戶端,而不是向所有客戶端廣播。問題是我處於某個AJAX請求的範圍內(在.aspx代碼隱藏的說吧),而不是在Hub或PersistentConnection中,所以沒有Clients屬性 - 以及使ajax(jquery)調用不是客戶端的客戶端我想發送信號消息!從SignalR呼叫特定客戶端
現在,我有一個集線器,它被稱爲JS頁面加載,註冊新的客戶端到服務器靜態列表,所以我有客戶端GUID。但不知道如何使用它將消息從服務器發送到特定的客戶端。
我想從服務器呼叫特定客戶端,而不是向所有客戶端廣播。問題是我處於某個AJAX請求的範圍內(在.aspx代碼隱藏的說吧),而不是在Hub或PersistentConnection中,所以沒有Clients屬性 - 以及使ajax(jquery)調用不是客戶端的客戶端我想發送信號消息!從SignalR呼叫特定客戶端
現在,我有一個集線器,它被稱爲JS頁面加載,註冊新的客戶端到服務器靜態列表,所以我有客戶端GUID。但不知道如何使用它將消息從服務器發送到特定的客戶端。
$('#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);
}
每當你發送一個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);
}
}
如果特定用戶實際上是調用者它的自我,你可以使用:
Clients.Caller.myJavaScriptClientFunction();
當你想發送消息到特定的ID
Clients.Client(Context.ConnectionId).onMessage(
new Message{From = e.Message.From, Body = e.Message.Body}
);
Thanx!這太容易了:) clientId是Hub中的Context.ClientId?客戶ID是否會在每個客戶請求中發生變化,Ayende在他的SR審覈中提到了一些情況,或者我可以依賴這一點爲每個客戶保持一致? –
「客戶端=連接」,所以每個請求都會給你一個新的客戶端ID。在SignalR的下一個版本中,我們將讓您覆蓋生成客戶端ID的邏輯,以便您可以將其與更相關的內容相關聯。現在,您應該將客戶端ID關聯到與您的應用程序相關的內容(如用戶名)。 – davidfowl
所以每次頁面呈現時(當我啓動集線器時),我必須用新的clientId更新我的用戶列表? –