无法在OnDisconnected上调用客户端方法

Not able to call client method on OnDisconnected

本文关键字:调用 客户端 方法 OnDisconnected      更新时间:2023-09-26

我在信号R的TestHub(由Hub继承(类中有一个disconnect方法。我无法从OnDisconnected方法调用javascript方法fnDeleteCustomer,但在Connect方法上调用了相同的js方法。我做错了什么?

 public override Task OnDisconnected()
        {
            try
            {
                 var customer = ConnectedUsers.Find(x => x.ConnectionID == Context.ConnectionId);
                if (customer!=null)
                {
                  Clients.Client(customer.ConnectionID).fnDeleteCustomer(customer.UserId);
                  return base.OnDisconnected();
                }
            }
            catch { };
            return null;
        }

根据MSDN:

当连接从此集线器实例断开连接时发生。

因此,您没有任何活动连接,也无法访问客户端集线器及其方法。

我想您应该使用客户端断开连接事件:

$.connection.hub.disconnected(function() {
    $.connection.hub.fnDeleteCustomer(userId);
});

有关信号机生存期事件的更多信息,请点击此处。

您无法执行fnDeleteCustomer,因为在执行OnDisconnected时,客户端已经断开与集线器的连接,因此在那一刻,客户端将没有ConnectionId

当然,您可以使用客户端disconnected方法,但SignalR断开连接大多发生在客户端离开相应页面时。

从我的角度来看,不是刚离开的客户想执行fnDeleteCustomer方法,而是剩下的客户,这样他们就可以被告知有人离开了。

希望这能有所帮助!祝你好运!

编辑:

如果你想通知所有其他客户有人离开,你只需这样做:

    public override OnDisconnected()
    {
        var customer = ConnectedUsers.Find(x => x.ConnectionID == Context.ConnectionId);
        Clients.All.notifySomeoneLeft(customer.Name);
    }

然后,创建客户端方法notifySomeoneLeft:

$.connection.client.notifySomeoneLeft = function(customerName){
   alert(customerName + "just left!");
  };

就是这样。每次有人离开,所有连接的客户端都会收到警报。

祝你好运!

public override OnDisconnected()
    {
        var customer = ConnectedUsers.Find(x => x.ConnectionID == Context.ConnectionId);
        Clients.All.notifySomeoneLeft(customer.Name);
    }

context.connectionId正在获取新的connectionId,而不是旧的connectionId。