Служба Azure SignalR | Asp.Net Веб-Api | консольный клиент

#c# #azure #signalr #signalr-hub

#c# #azure #signalr #signalr-концентратор

Вопрос:

Я могу подключиться к службе Azure SignalR из Asp.Net Веб-приложение, использующее свой ключ доступа. Asp.Net Веб-приложение создает и размещает концентратор поверх службы Azure SignalR. Я создал консольный клиент c # и подключился к Asp.Net Концентратор SignalR веб-приложения, использующий Microsoft.AspNetCore.SignalR.Client библиотеку.

Вопросы:

  1. Должен ли я всегда внедрять промежуточное программное обеспечение, подобное Asp.Net Веб-приложение и полагаться на него для создания концентратора и обмена данными через него? Да, основываясь на Samara и других источниках, у нас есть несколько вариантов.

    • Используйте REST API из консольного приложения для размещения концентратора (Azure SignalR) в качестве сервера и обслуживания клиентов подписчиков в качестве портала. Это поддерживает однонаправленный обмен сообщениями.
    • Используйте REST API из функций Azure (сделайте его бессерверным) для размещения концентратора (Azure SignalR) в качестве сервера и обслуживания клиентов подписчиков в качестве портала. Это поддерживает однонаправленный обмен сообщениями.
    • Разместите концентратор (Azure SignalR) из Asp.Net управляемый веб-API с помощью auth() layer и обслуживание клиентов через API. Это полностью поддерживает двунаправленный обмен сообщениями.
  2. Невозможно напрямую связаться со службой Azure SignalR из консоли c #, чтобы создать концентратор и отправлять мои сообщения через концентратор?

    • Используйте REST API из консольного приложения для размещения концентратора (Azure SignalR) в качестве сервера и обслуживания клиентов подписчиков в качестве портала. Это поддерживает однонаправленный обмен сообщениями.
    • Используйте REST API из функций Azure (сделайте его бессерверным) для размещения концентратора (Azure SignalR) в качестве сервера и обслуживания клиентов подписчиков в качестве портала. Это поддерживает однонаправленный обмен сообщениями.

Я новичок в службе Azure SignalR; пожалуйста, помогите мне с вышеуказанными вопросами. На мои вопросы почти даны ответы. Надеюсь, это поможет!

P.S. У людей нет реальных ответов, держитесь подальше

Комментарии:

1. Вы можете использовать любой тип проекта, который вы хотите, для достижения своей цели. SignalR — это просто система для реализации подключений к websocket, которая обычно выполняется совместно с веб-службами, но это не является обязательным требованием.

2. Итак, в консольном клиенте я нашел образец проекта github под названием «Бессерверный». Он взаимодействует со службой Azure SignalR, чтобы создать концентратор, транслирующий сообщения для отдельного пользователя всем пользователям. Но отдельный пользователь не смог отправлять сообщения в Hub. Как сделать так, чтобы два приложения для синхронизации данных были похожи на чат.

3. @SamaraSoucy-MSFT, интеграция службы Azure SignalR с Asp.Net Приложения и консольный клиент, похоже, сильно отличаются друг от друга. Интеграция с SignalR не является бесшовной.

4. @SamaraSoucy-MSFT, заранее благодарю за вашу помощь!

Ответ №1:

Я думаю, что немного лучше понимаю ваш вопрос. Я думаю, вы говорите о приведенном здесь примере кода? https://github.com/aspnet/AzureSignalR-samples/tree/master/samples/Serverless

Если вы хотите создать приложение для чата, вам следует изменить код, чтобы объединить две функции. Я смог сделать это, обновив program.cs для запуска обоих наборов кода. Это не полноценный клиент чата — во всех сообщениях по-прежнему говорится, что они приходят от другого пользователя, но я надеюсь, это даст вам лучшее представление о том, как это работает.

     app.Command("client", cmd =>
    {
        cmd.Description = "Start a client to listen to the service";
        cmd.HelpOption("--help");

        var userId = cmd.Argument("<userId>", "Set User ID");

        cmd.OnExecute(async () =>
        {
            var connectionString = connectionStringOption.Value() ?? configuration["Azure:SignalR:ConnectionString"];

            if (string.IsNullOrEmpty(connectionString) || !hubOption.HasValue())
            {
                MissOptions();
                return 0;
            }

            var client = new ClientHandler(connectionString, hubOption.Value(), userId.Value);

            await client.StartAsync();

//Add the server to the client so we can talk both ways
            var server = new ServerHandler(connectionString, hubOption.Value());
            await server.Start();


            Console.ReadLine();
            await client.DisposeAsync();

            return 0;
        });
    });
  

Следует кое-что иметь в виду, и почему большинство из этих примеров добавляют слой API поверх службы SignalR. Для того, чтобы создать соединение со службой, вы используете ключ. Если вы встроите это в свое консольное приложение, а затем удалите его, любой пользователь с приложением теперь сможет управлять всеми вашими концентраторами, извлекая ключ. Если вы не доверяете эту возможность всем своим пользователям, то лучше добавить уровень API — пользователь проходит аутентификацию в API, и API решает, какие разрешения у них есть на концентраторе.

Комментарии:

1. SamaraSoucy-MSFT, оказывается, что, подобно SQL Server или другим внутренним серверам, мы должны создать промежуточное программное обеспечение для обмена сообщениями через Azure SignalR Service Hub.

2. SamaraSoucy-MSFT, если мы не создаем приложение для чата или портативные приложения, мы прекрасно используем службу Azure SignalR с помощью консольного приложения.

3. Да, SamaraSoucy-MSFT. Вчера я проверил этот образец. Бессерверный образец был однонаправленным. Только сервер может транслировать сообщения подписчикам. Подписчики не могут отправлять сообщения обратно на сервер, если это необходимо в крайних случаях.

4. Я искал причины. Похоже, что REST API службы Azure SignalR не позволяет отдельным пользователям или подписчикам отправлять обратные сообщения на серверный концентратор.

5. Я забыл поблагодарить вас за усилия! Завтра я попробую выполнить упражнение и поделюсь результатами.