javascript - 如何从 Hub 中删除用户?

标签 javascript c# ajax asp.net-mvc signalr

我通过 ajax post 请求向 Controller 中的方法发送一个我应该踢的字符串“userName”。 是否可以调用 Controller 中的方法从当前集线器中删除用户?

  public ActionResult Kick(string userName)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
        var user = userService.GetUserByName(userName);
        var room = chatRoomService.GetRoomById(user.ChatRoomId.Value);
        user.IsKicked = true;
        userService.LeaveRoom(user);
        hubContext.Groups.Remove(user.ConnectionIdInHub, room.Name);
        return Json(new {success = true});
    }

我可以在这个方法的某个地方断开用户与集线器的连接吗?

最佳答案

服务器端-

您应该在用户连接时存储用户的连接 ID

在服务器端就像这样-

public override Task OnConnected()
{
    Boolean isFoundAnydevice = false;

    if(receivedClientId.Length>0)   //With Param
    {
        int noOfSelectedDevice = _context.TargatedDevice.Where(x => x.PhoneId == receivedClientId).Count();
        if (noOfSelectedDevice > 0)
            isFoundAnydevice = true;
    }
    else   //With no Param
    {
        String deviceId = _context.Device.Where(d => d.ConnectionId == this.Context.ConnectionId).Select(d => d.ClientId).SingleOrDefault();
    int noOfSelectedDevice = _context.TargatedDevice.Where(x => x.PhoneId == deviceId).Count();
        if (noOfSelectedDevice > 0)
            isFoundAnydevice = true;
    }

    if (isFoundAnydevice)
    {
        _logger.LogWarning(
                        receivedClientId + " added to Test group"
                        );
        Groups.Add(this.Context.ConnectionId, testGroupName);
    }   

    return base.OnConnected();
}

然后你就可以轻松地从DB中找到用户的连接ID。

现在您可以像这样轻松停止集线器连接 -

public Task Disconnect(string connectionId)
{
    try
    {
        lock (_lock)
        {
            var connections = _registeredClients.Where(c => c.Value.Any(connection => connection == connectionId)).FirstOrDefault();

            // if we are tracking a client with this connection 
            // remove it
            if (!CollectionUtil.IsNullOrEmpty(connections.Value))
            {
                connections.Value.Remove(connectionId);

                // if there are no connections for the client, remove the client from the tracking dictionary
                if (CollectionUtil.IsNullOrEmpty(connections.Value))
                {
                    _registeredClients.Remove(connections.Key);
                }
            }
        }
    }
    catch (Exception ex)
    {
        Log.Error(this, "Error on disconnect in hub", ex);
    }

    return null;
}

更多内容可以在这里找到。

客户端-

如果您想从客户端执行此操作,您可以这样做-

$.connection.hub.stop();

希望你能得到答案

关于javascript - 如何从 Hub 中删除用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273765/

相关文章:

Javascript持久变量,在删除节点后存储节点

javascript - SAPUi5 文件 uploader 设置 WebKitFormBoundary

JavaScript 日期和时间显示错误

c# - 显示 HH :mm:ss in DateTime x axis in Chart C#

c# - 组合接口(interface)的代码契约

jquery - 停止缓存 jQuery .load 响应

javascript - 用 jQuery 实现 "this is taking too long"消息

javascript - req.body 没有显示为键值对之一,但 req.headers 和其他文件却显示为键值对之一

c# - UInt32.TryParse() 十六进制数不工作

javascript - 继续执行脚本之前等待 AJAX 响应