Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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#_Asp.net_Signalr_Signalr Hub_Signalr.client - Fatal编程技术网

C# 信号器-未连接发送消息

C# 信号器-未连接发送消息,c#,asp.net,signalr,signalr-hub,signalr.client,C#,Asp.net,Signalr,Signalr Hub,Signalr.client,我今天一直在试验信号器,它真的很棒。基本上,我希望实现以下目标: 设备连接后,应立即向第一台设备发送消息。如果连接的设备超过1台,我想发送两条消息。一对所有,最后连接的客户端除外。只向最后连接的客户端发送一条消息 当我将代码放在自定义API控制器中并基本上调用操作时,我使用的代码工作得非常完美,但这不是我想要的 我希望在设备在OnConnected内连接时立即发送消息,无需任何用户交互,但当我将代码放入OnConnected覆盖时,它将停止工作。它不再发送到特定的客户端(第一次连接和最后一次连接

我今天一直在试验信号器,它真的很棒。基本上,我希望实现以下目标:

设备连接后,应立即向第一台设备发送消息。如果连接的设备超过1台,我想发送两条消息。一对所有,最后连接的客户端除外。只向最后连接的客户端发送一条消息

当我将代码放在自定义API控制器中并基本上调用操作时,我使用的代码工作得非常完美,但这不是我想要的

我希望在设备在
OnConnected
内连接时立即发送消息,无需任何用户交互,但当我将代码放入
OnConnected
覆盖时,它将停止工作。它不再发送到特定的客户端(第一次连接和最后一次连接)

我希望有人能帮我解决这个问题,因为我已经头痛好几个小时了

    public override System.Threading.Tasks.Task OnConnected()
    {
        UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);

        int amountOfConnections = UserHandler.ConnectedIds.Count;
        var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
        var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();

        if (amountOfConnections == 1)
        {
            Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
        }
        else
        {
            Clients.Clients(allExceptLast).hello("Send to everyone except last");
            Clients.Client(lastConnection.Key).hello("Send to only the last one");
        }

        return base.OnConnected();
    }

嗯。。。您正在返回一个任务。。。所以我认为这可能是问题所在。。。 您应该首先执行代码,然后返回任务。。。或者继续写下。。。像

    public override Task OnConnected()
    {
        Task task = new Task(() =>
            {
                UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);

                int amountOfConnections = UserHandler.ConnectedIds.Count;
                var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
                var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();

                if (amountOfConnections == 1)
                {
                    Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
                }
                else
                {
                    Clients.Clients(allExceptLast).hello("Send to everyone except last");
                    Clients.Client(lastConnection.Key).hello("Send to only the last one");
                }
            });

        task.ContinueWith(base.OnConnected());

        return task;
    }

我还没有测试过。。。这只是一个猜测。

因为您还没有建立连接,所以尝试调用您的客户端
。hello()
函数在
OnConnected
中是不可能的。但是,我们可以定义一个服务器集线器方法,并在连接
.done
回调时立即调用它。然后,在新的服务器方法中,我们可以重新分配您当前在
OnConnected
中的逻辑

这将大大改变我们的设置,并引入一些额外的步骤,但请注意以下示例

// WhateverHub
public override Task OnConnected()
{
    return base.OnConnected()
}

public void AfterConnected()
{
    // if(stuff) -- whatever if/else first user/last user logic
    // {
        Clients.Caller.hello("message")
    // }
}

所以这里的基本思想是首先

  • Connect=>
    .done(函数(){…})
  • 调用
    server.afterConnected()
  • 在该方法中执行逻辑
  • 如果我们对条件感到满意,请调用我们的
    .hello()
    客户机函数


  • 注意-此实现适用于JavaScript客户端-但同样的想法也可以转换为.net客户端。这主要是一个架构问题。

    除非我从您的问题中漏掉了什么,否则解决方案对我来说非常简单,您只需要切换到使用

    Clients.Caller.hello("Send to only the last one");
    
    不要试图了解你自己谁是最后连接的id。其他id也一样,你可以使用:

    Clients.Others.hello("Send to everyone except last");
    
    您不需要设置所有的逻辑,这两行可以满足您的需要,它们在连接的
    OnConnected

    内部工作,谢谢您的帮助(大家投票支持)。实际上发现了问题。。它在我的客户体内。我首先订阅了“hello”功能,然后启动了HubConnection。我一改变订单,一切都很顺利

    它使用以下客户端代码:

        private async Task ConnectToSignalR()
        {
            var hubConnection = new HubConnection("url");
            hubConnection.Headers["x-zumo-application"] = "clientapikey";
    
            IHubProxy proxy = hubConnection.CreateHubProxy("ChatHub");
    
            proxy.On<string>("hello", async (msg) =>
            {
                Console.WriteLine(msg);
            });
    
            await hubConnection.Start();
        }
    
    专用异步任务ConnectToSignalR()
    {
    var hubConnection=新的hubConnection(“url”);
    hubConnection.Headers[“x-zumo-application”]=“clientapkey”;
    IHubProxy=hubConnection.CreateHubProxy(“ChatHub”);
    proxy.On(“hello”,async(msg)=>
    {
    控制台写入线(msg);
    });
    等待连接。开始();
    }
    
    非常感谢您的代码。它实际上使我的代码更容易!
        private async Task ConnectToSignalR()
        {
            var hubConnection = new HubConnection("url");
            hubConnection.Headers["x-zumo-application"] = "clientapikey";
    
            IHubProxy proxy = hubConnection.CreateHubProxy("ChatHub");
    
            proxy.On<string>("hello", async (msg) =>
            {
                Console.WriteLine(msg);
            });
    
            await hubConnection.Start();
        }