SignalR - 发送消息OnConnected

Mit*_*hel 9 c# asp.net signalr signalr-hub signalr.client

我今天一直在尝试使用SignalR,它非常整洁.基本上我想要实现的目标如下:

一旦设备连接,它应该向第一个发送消息.如果有超过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();
    }
Run Code Online (Sandbox Code Playgroud)

Was*_*asp 11

除非我错过了你的问题,否则解决方案看起来很简单,你只需要切换到使用

Clients.Caller.hello("Send to only the last one");
Run Code Online (Sandbox Code Playgroud)

而不是试图了解自己谁是最后一个连接ID.与其他相同,您可以使用:

Clients.Others.hello("Send to everyone except last");
Run Code Online (Sandbox Code Playgroud)

你不需要你设置的所有逻辑,这2行做你需要的,他们在里面工作OnConnected.


Mit*_*hel 5

感谢您的所有帮助(支持你们)。实际发现了问题..这是在我的客户内部。我首先订阅了“ 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();
    }
Run Code Online (Sandbox Code Playgroud)