Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试轮询现有连接时未触发信号器发送方法_C#_Jquery_Asp.net_Signalr_Signalr Hub - Fatal编程技术网

C# 尝试轮询现有连接时未触发信号器发送方法

C# 尝试轮询现有连接时未触发信号器发送方法,c#,jquery,asp.net,signalr,signalr-hub,C#,Jquery,Asp.net,Signalr,Signalr Hub,我在jQuery中使用了最新版本的signar,并获得了一些奇怪的行为,其中用户断开了连接,但仍然挂在我的“UserQueue”中,尽管断开了连接 我认为这可能与以下事实有关:页面刷新似乎几乎同时触发断开连接的OnDisconnected和连接的OnConnected事件。当我在其中一个方法中设置断点并单步执行时,我的指针在每一步的两个方法之间来回反弹(F10) 我想对每个OnConnected事件运行一次检查,以找出谁实际连接到了我的应用程序。我想在OnConnected事件中从我的C#代码触

我在jQuery中使用了最新版本的signar,并获得了一些奇怪的行为,其中用户断开了连接,但仍然挂在我的“UserQueue”中,尽管断开了连接

我认为这可能与以下事实有关:页面刷新似乎几乎同时触发断开连接的
OnDisconnected
和连接的
OnConnected
事件。当我在其中一个方法中设置断点并单步执行时,我的指针在每一步的两个方法之间来回反弹(
F10

我想对每个
OnConnected
事件运行一次检查,以找出谁实际连接到了我的应用程序。我想在OnConnected事件中从我的C#代码触发一个JS事件,然后允许客户端/前端对用户的存在进行确认:

public override Task OnConnected()
{
    // Check for other users:
    Clients.All.checkForOtherUsers();

    // Do stuff with my user queue
    var curmodelId = GetModelId(Context);
    var curUserConnection = GetCurrentUser(Context);
    // First create the ledger is missing, setting the modelId as the first key
    if (_ledger == null)
    {
        _ledger = new ConnectionLedger(curmodelId, curUserConnection);
    }
    else
    {
        // key not found, create new connection pool this model
        if (!_ledger.PoolIds.Contains(curmodelId))
        {
            _ledger.AddConnectionPool(curmodelId, curUserConnection);
        }
        else
        {
            var curModelPool = _ledger.ConnectionPools.First(x => x.Id == curmodelId);
            curModelPool.UserQueue.Enqueue(curUserConnection);
        }
    }

    return base.OnConnected();
}   
现在在客户端JS中,如果我有以下代码:

modelHub.client.checkForOtherUsers = function () {
    // I can see logging here if I add console.log("checking for other users...")
    modelHub.server.send();
}
…我希望我的C#
Send
方法能够接收回上下文(如果用户确实在客户端等待JS执行),并更新我的
UserQueue

public void Send()
{
    var curmodelId = GetModelId(Context);
    var curModelPool = _ledger.ConnectionPools.First(x => x.Id == curmodelId);
    var curUserConnection = GetCurrentUser(Context);
    curModelPool.UserQueue.Enqueue(curUserConnection);
}
。。。但是我的
Send
方法永远不会被激发,即使我直接从JS控制台
$.connection.modelingHub.server.Send()激发它

为什么Send方法不启动?信号器库的事件顺序/异步性质是否导致了这种情况?


对总体设计的评论也是受欢迎的(因为我怀疑这可能很愚蠢),但请注意,由于我的自定义身份验证配置,我无法访问
上下文.User
客户端.User

似乎是以下两个原因

服务器端
调用
Clients.All.checkForOtherUsers()不好
OnConnected()中

我建议接通后再打电话

请参阅

客户端
在调用start方法之前,可能需要注册
modelHub.client.checkForOtherUsers=function(){

通常在调用start方法之前注册事件处理程序 建立连接。如果要注册某些事件 在建立连接之后,您可以这样做,但是 在调用之前,必须注册至少一个事件处理程序 启动方法。
-


感谢您的输入。服务器部分已经在使用该模式。对于客户端,我如何“在调用start方法之前注册事件处理程序”?它的意思如下。(我不确定,因为我看不到所有客户端代码。)
modelHub.client.checkForOtherUsers=function(){modelHub.server.send();}$.connection.hub.start()