Table of Contents

Подписка на события элемента структуры

Polynom Web API позволяет оформлять подписки на объекты классификации. После оформления подписки сервис BackgroundTask будет уведомлять вас об изменениях свойств и изменениях коллекций. Вы можете получать данные, например, в веб-интерфейс с помощью TypeScript, однако в данном примере рассмотрим получение данных в консольное приложение на C#.

Важное замечание

Сервис уведомляет только о факте события и не возвращает новые данные. Например, при изменении имени группы сервис пришлёт уведомление «NameChanged in [14566:39]»; новое имя можно узнать, обратившись к свойствам объекта по идентификатору из уведомления.

Проект для данного примера разработан в Visual Studio 2022 Community. Тип создаваемого проекта: консольное приложение, которое может выполняться в среде .NET в Windows, Linux и macOS. Платформа: .NET 6.0.

После создания в проект нужно добавить две зависимости (через «Управление пакетами NuGet»):

  1. Microsoft.AspNetCore.SignalR.Client — для получения сообщений от сервера с помощью SignalR.
  2. Microsoft.AspNetCore.Http.Connections.Common — для создания подключения к серверу через HubConnection.

alt text

Для подключения к хабу нужно указать его адрес и сформировать токен авторизации.

  1. Как узнать адрес хаба? Откройте главную страницу Swagger Polynom Web API. В примере это адрес http://polynom-api:5000/api/index.html. Замените api/index.html на polynom-hub.

alt text

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

alt text

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

alt text

Теперь рассмотрим, как в программе с помощью этих двух параметров создается соединение с хабом:

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 — имя сервиса, от которого получаются данные. Этот параметр неизменен в рамках работы с подписками на события.

Теперь запускаем консольное приложение: первым шагом вводим адрес для подключения к хабу, вторым — токен авторизации. Если всё верно, мы увидим уведомление об успешном подключении:

alt text

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

alt text

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

alt text

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

alt text

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