Table of Contents

Руководство по разработке приложения для отслеживания событий объектов через SignalR

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'a Polynom Web API. В моём примере это адрес: http://polynom-api:5000/api/index.html. Нужно заменить "api/index.html" на "polynom-hub"

alt text

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

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();

Когда соединение активно, принимать входящие сигналы можно с помощью следующей конструкции:

connection.On<string>("BackgroundTaskProgress", (message) =>
{
	Console.WriteLine(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

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