我无法通过代码将消息发送给特定用户。 Clients.All
可以正常工作,Clients.AllExcept(userId)
也可以正常工作,但是 Clients.User(userId)
不能正常工作。
我的 Hub:
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();
}
}
我从代码后台发送消息的控制器:
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();
}
如何在JS上初始化我的中心:
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();
}
最后,我如何向中心发送一条(空)消息:
function TestSendToUser(connectionId)
{
$.ajax({
url: '/Default/PostMessageToUser',
type: "POST",
data: { ConnectionId: connectionId},// contains the user I want to send the message to
});
}
因此,mappingHub.Clients.All.onMessageRecorded();
可以完美地工作,但是 mappingHub.Clients.User(ConnectionId).onMessageRecorded();
或 mappingHub.Clients.Users(new List<string>() { ConnectionId}).onMessageRecorded();
不起作用。
但是有趣的是,mappingHub.Clients.AllExcept(ConnectionId).onMessageRecorded();
可以正常工作:所有连接的用户都会收到消息,除了给定的用户ID,这意味着用户ID 是有效的,并且已经成功识别该用户。那么为什么 Clients.User(ConnectionId)
不起作用呢?