我有一个Web API项目,其中有一个SignalR集线器,用于向特定客户端发送消息(在单独的MVC应用程序中)。发送给所有客户端工作正常但发送到特定客户端一直是一个挑战。如何更改代码才能完成此操作?以下是我目前的设置。
Hub Class(在别处读取,可以将每个用户关联到一个组)
[HubName("GWEventHub")]
public class GatewayEventHub : Hub
{
public override Task OnConnected()
{
this.Groups.Add(this.Context.ConnectionId, this.Context.Request.User.Identity.Name);
return base.OnConnected();
}
// No other methods needed as client does not need to message the server
}
API控制器中的代码,用于向客户端发送消息
private void SendClientMessage(string message)
{
var context = GlobalHost.ConnectionManager.GetHubContext<GatewayEventHub>();
context.Clients.All.sendClientMessage(message);
}
客户代码
$(function () {
$.connection.hub.url = "http://localhost:53453/signalr";
var hub = $.connection.GWEventHub;
hub.client.sendClientMessage = function(message) {
console.log("message recieved from GW service " + message);
}
$.connection.hub.start().done(function () {
console.log('connect to GatewayEventHub, Connection ID = ' + $.connection.hub.id);
})
.fail(function (e) {
console.error('Failed to connect to signalr hub at ' + hub.url + 'Connection Error: ' + e);
});
});
答案 0 :(得分:1)
我会创建一个ChatRoom(如果它正在进行聊天)类,它包含所有连接的用户ID或连接,具体取决于您是否希望聊天室对于每个连接的用户(UserId)是全局的,或者如果您希望ChatRoom对每个浏览器选项卡(连接ID)都是唯一的。
当您连接到聊天室时,将user / conn.id添加到聊天室实例。如果您在集线器中覆盖OnDisconnect并将用户从所有聊天室中删除,则可以确保用户被处置。