コードの背後にある特定のユーザーにメッセージを送信することはできません。 Clients.All
が動作しますが、Clients.AllExcept(userId)
は動作しますが、Client.User(userId)
は動作しません。SignalRを使用して特定のユーザーにメッセージを送信できません
マイハブ:
public class MessagingHub : Hub
{
public override Task OnConnected()
{
var signalRConnectionId = Context.ConnectionId;
// for testing purpose, I collect the userId from the VS Debug window
System.Diagnostics.Debug.WriteLine("OnConnected --> " + signalRConnectionId);
return base.OnConnected();
}
}
背後にあるコードからメッセージを送信するために私のコントローラ:私のハブはJSに初期化されている方法
public void PostMessageToUser(string ConnectionId)
{
var mappingHub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>();
// doesn't works
mappingHub.Clients.User(ConnectionId).onMessageRecorded();
// doesn't works
mappingHub.Clients.Users(new List<string>() { ConnectionId }).onMessageRecorded();
// works
mappingHub.Clients.All.onMessageRecorded();
// works (?!)
mappingHub.Clients.AllExcept(ConnectionId).onMessageRecorded();
}
:
var con, hub;
function StartRealtimeMessaging()
{
con = $.hubConnection();
hub = con.createHubProxy('MessagingHub');
hub.on('onMessageRecorded', function() {
$(".MessageContainer").append("<div>I've received a message!!</div>");
});
con.start();
}
そして最後に、私はハブに(nは空の)メッセージを送信する方法:
function TestSendToUser(connectionId)
{
$.ajax({
url: '/Default/PostMessageToUser',
type: "POST",
data: { ConnectionId: connectionId},// contains the user I want to send the message to
});
}
だから、それはmappingHub.Clients.User(ConnectionId).onMessageRecorded();
かmappingHub.Clients.Users(new List<string>() { ConnectionId}).onMessageRecorded();
と完全にmappingHub.Clients.All.onMessageRecorded();
ではなく動作します。すべてのユーザーは、ユーザーIDが良い意味指定したユーザID、以外メッセージを受け取る接続されており、ユーザーがよく識別されます。興味深いことに
しかしは、それがmappingHub.Clients.AllExcept(ConnectionId).onMessageRecorded();
で動作します。だから、Clients.User(ConnectionId)
はなぜ機能しないのですか?
+1の回答ですが、1人のユーザーだけのグループを作成することは回避策であり、実際の解決策ではありません。私は 'Clients.User(srUserId)'が動作しないと信じられません... –
まあ、私は最終的に答えを見つけました。私の答えを見てください。 (それもあなたを助けることを望みます;)) –
あなたは正しいです、私は '回避策'を使用すべきでした - 私は答えを修正しました。本当の答えを見いだす素晴らしい仕事。 .Group()の回避策は、SignalRが内部のuserID/ConnectionIDリレーションシップを管理するという点で優雅さがあります。つまり、メッセージIDにuserIDを直接使用することはできません。そのためのテスト回避策として、userIDテーブルにconnectionIDを追加しました。私はライブDBでそれをする必要はありませんでした。 –