从服务器向集线器外部的特定客户端广播消息

时间:2015-04-30 19:53:58

标签: asp.net asp.net-mvc signalr

我有一个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);
    });

});

1 个答案:

答案 0 :(得分:1)

我会创建一个ChatRoom(如果它正在进行聊天)类,它包含所有连接的用户ID或连接,具体取决于您是否希望聊天室对于每个连接的用户(UserId)是全局的,或者如果您希望ChatRoom对每个浏览器选项卡(连接ID)都是唯一的。

当您连接到聊天室时,将user / conn.id添加到聊天室实例。如果您在集线器中覆盖OnDisconnect并将用户从所有聊天室中删除,则可以确保用户被处置。