SignalR-Отправить сообщение OnConnected

Я сегодня экспериментировал с 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();
    }

4 ответов


Если я не пропустил что-то из вашего вопроса, решение выглядит довольно простым для меня, вам просто нужно переключиться на использование

Clients.Caller.hello("Send to only the last one");

вместо того, чтобы пытаться понять себя, Кто последний связан идентификатор. То же самое для других, вы можете использовать:

Clients.Others.hello("Send to everyone except last");

вам не нужна вся логика, которую вы настраиваете, эти 2 строки делают то, что вам нужно, и они работают внутри OnConnected.


Спасибо за всю помощь (upvoted вы, ребята). На самом деле нашел проблему.. это было внутри моего клиента. Я впервые подписались на функцию "Привет" и после этого я начал 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();
    }

поскольку вы еще не установили соединение, попробуйте позвонить своему клиенту


Примечание - эта реализация предназначена для клиента JavaScript, но та же идея может быть переведена на клиент .net. Это в основном архитектурный вопрос.


хорошо... вы возвращаете задание... поэтому я думаю, что это может быть проблемой... сначала вы должны выполнить свой код, а затем вернуть задачу... или поставить ContinueWith... как...

    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;
    }

Я не проверял это... это только догадка..