Подписка на события элемента структуры
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 Polynom Web API. В примере это адрес
http://polynom-api:5000/api/index.html. Заменитеapi/index.htmlнаpolynom-hub.

- Как сформировать токен авторизации? Авторизуйтесь с помощью Swagger (раздел Login, метод sign-in), указав идентификатор хранилища и логин с паролем пользователя.

Параметр "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();
Когда соединение активно, принимать входящие сигналы можно с помощью следующей конструкции:
// Текст последнего уведомления сервиса BackgroundTask.
string lastNotification = string.Empty;
connection.On<string>("BackgroundTaskProgress", (message) =>
{
// Сохраняем уведомление для дальнейшей обработки.
lastNotification = message;
});
Здесь в параметре message приходит сигнал от хаба, а BackgroundTaskProgress — имя сервиса, от которого
получаются данные. Этот параметр неизменен в рамках работы с подписками на события.
Теперь запускаем консольное приложение: первым шагом вводим адрес для подключения к хабу, вторым — токен авторизации. Если всё верно, мы увидим уведомление об успешном подключении:

Затем с помощью этого же токена нужно авторизоваться в Swagger: нажмите на замок справа от любого метода.
Во всплывающем окне в поле «Value» введите Bearer, поставьте пробел и вставьте значение токена
(пример на скриншоте ниже). Затем нажмите кнопку «Authorize», а после — «Close».

В примере используется группа «Стали» с идентификатором в хранилище [objectId = 14566, typeId = 39].
Перейдите в Swagger к разделу «BackgroundTask», метод «subscribe-on-structure-item», укажите
идентификатор группы «Стали» и нажмите кнопку «Execute».

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

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