Руководство по разработке приложения для отслеживания событий объектов через SignalR
Polynom Web API позволяет оформлять подписки на объекты классификации. После оформления подписки сервис BackgroundTask будет уведомлять вас об изменениях свойств и изменениях коллекций. Вы можете получать данные, например, в веб-интерфейс с помощью TypeScript, однако в данном примере рассмотрим получение данных в консольное приложение на C#.
Важное замечание:
сервис уведомляет только о факте события, он не возвращает новые данные. Например, изменилось имя группы, сервис пришлёт уведомление «NameChanged in [14566:39]», новое имя можно узнать, обратившись к свойствам объекта по идентификатору в уведомлении.
Проект для данного примера был разработан в Visual Studio 2022 Community. Тип создаваемого проекта: Консольное приложение, которое может выполняться в среде .NET в Windows, Linux и macOS Платформа: .NET 6.0
После создания, в проект нужно подключить две зависимости (с помощью «Управление пакетами NuGet»):
- Microsoft.AspNetCore.SignalR.Client (для получения сообщений от сервера с помощью SignalR)
- Microsoft.AspNetCore.Http.Connections.Common (для создания подключения к серверу через HubConnection)

Для подключения к хабу нам нужно указать его адрес и сформировать токен авторизации.
- Как узнать адрес хаба? Откройте главную страницу swagger'a Polynom Web API. В моём примере это адрес: http://polynom-api:5000/api/index.html. Нужно заменить "api/index.html" на "polynom-hub"

- Как сформировать токен авторизации? Авторизуемся с помощью swagger'a (раздел Login, метод sign-in, ваши данные: id хранилища и логин/пароль пользователя)

Параметр "accessToken" в ответе — это и есть токен авторизации.

Теперь рассмотрим как в программе с помощью этих двух параметров создаётся соединение с хабом:
var connection = new HubConnectionBuilder().WithUrl(new Uri(urlString),
HttpTransportType.WebSockets,
options =>
{
options.SkipNegotiation = true;
options.AccessTokenProvider = () => Task.FromResult(token);
}).Build();
Здесь urlString и token - адрес хаба и токен соответственно, оба параметра типа String.
После создания соединение запускается с помощью команды:
await connection.StartAsync();
Когда соединение активно, принимать входящие сигналы можно с помощью следующей конструкции:
connection.On<string>("BackgroundTaskProgress", (message) =>
{
Console.WriteLine(message);
});
Здесь в параметре message приходит сигнал от хаба, а BackgroundTaskProgress — это имя сервиса, от которого получаете данные. Этот параметр неизменен в рамках работы с подписками на события.
Теперь запускаем консольное приложение, первым шагом вводим адрес для подключения к хабу, вторым шагом — токен авторизации. Если всё верно, то то мы должны увидеть увемоление об успешном подключении:

Заетем с помощью этого же токена нужно авторизоваться в swagger'е. Для этого жмём на замочек справа от любого метода. Во всплывающем окне в поле "Value" пишем: "Bearer", затем пробел, затем вставляем значение токена (пример на скриншоте ниже). Теперь жмём кнопку "Authorize", потом "Close"

В данном примере я использую группу "Стали", её идентификатор в моей базе [objectId = 14566, typeId = 39]. Переходим в swagger'е к разделу "BackgroundTask", метод "subscribe-on-structure-item". Указываем идентификатор группы "Стали", нажимаем кнопку "Execute"

Итак, мы подписались на события этой группы. В swagger'е придёт только статус ответа: 200 OK Открываем десктопный "Редактор справочников" и меняем группе имя, затем открываем десктопный "Клиент" и добавляем или удаляем любой объект группы. Через какое-то время (10-20 секунд) в консольное приложение придут соответствующие оповещения

Теперь можно подписаться на события других элементов классификации, все изменения также будут отображаться в консольном приложении. Новые подписки не отменяют старых.