Получение свойств объекта по расположению
Пример показывает, как получить свойства объекта структуры по строке расположения средствами
клиентской библиотеки Ascon.Polynom.Web.Api.Client. Проект — Samples.WebApi.GetPropertyByLocation.
Требования
- .NET 8.
- Запущенный web-сервер ПОЛИНОМ:MDM с доступным хранилищем.
- Пакет
Ascon.Polynom.Web.Api.Clientиз локального фида (подключается автоматически).
Алгоритм
- Получить строку расположения объекта.
- Авторизоваться в web-API.
- Запросить свойства объекта по расположению.
- Обработать и сохранить результат.
- Выйти из сессии.
Получение строки расположения
Строка расположения берётся из клиента ПОЛИНОМ:MDM командой копирования расположения.


Формат строки расположения:
<location producer="1EB9C616-BC33-4B47-A045-A171F86CDD07" ver="2" cls="ElementData" id="83a90c2c-8b65-4ff3-af11-87523301ddc5"><item cls="GroupData" id="8c7939e3-86e7-45dd-a23d-904040620992"/></location>
Авторизация
Авторизация выполняется хелпером PolynomClientSession, который использует
PolynomApiClientFactory и
AuthorizationService.
Подробно — в разделе
Авторизация в C# через клиентскую библиотеку.
Реализация запроса
Свойства объекта запрашиваются методом GetByLocation сервиса
PropertyOwnerApiClient.
Расположение передаётся строкой, ответ — модель
PropertyOwnerContainer.
Результат проверяется на null с выбросом исключения, а сводка оформляется отдельным классом
PropertyCounts (см. ниже).
using Ascon.Polynom.Web.Api.Client.Json;
using Samples.WebApi.Common.Services;
using var session = await PolynomClientSession.CreateAsync(cancellationToken);
// Строка расположения объекта, скопированная из клиента ПОЛИНОМ:MDM.
var location = "<location ... />";
var propertyContainer = await session.Factory.CreatePropertyOwnerApiClient()
.GetByLocation(location, cancellationToken)
?? throw new InvalidOperationException($"Свойства объекта по расположению «{location}» не получены.");
// Сводка по количеству свойств разных типов.
var counts = PropertyCounts.FromContainer(propertyContainer);
// Сохранение полного ответа в файл JSON.
var json = JsonSerializer.Serialize(propertyContainer,
new JsonSerializerOptions(PolynomJsonOptions.Options) { WriteIndented = true });
await File.WriteAllTextAsync("properties-by-location.json", json, cancellationToken);
await session.SignOutAsync(cancellationToken);
Класс сводки по типам свойств
using Ascon.Polynom.Web.Api.Client.Models;
/// <summary>
/// Сводка по количеству свойств объекта по типам значений.
/// </summary>
public sealed class PropertyCounts
{
/// <summary>Количество строковых свойств.</summary>
public int String { get; init; }
/// <summary>Количество целочисленных свойств.</summary>
public int Integer { get; init; }
/// <summary>Количество вещественных свойств.</summary>
public int Double { get; init; }
/// <summary>Количество бинарных свойств.</summary>
public int Binary { get; init; }
/// <summary>
/// Создаёт сводку по контейнеру свойств.
/// </summary>
/// <param name="container">Контейнер свойств объекта.</param>
/// <returns>Сводка по типам свойств.</returns>
/// <exception cref="ArgumentNullException">Контейнер не задан.</exception>
public static PropertyCounts FromContainer(PropertyOwnerContainer? container)
{
ArgumentNullException.ThrowIfNull(container);
return new PropertyCounts
{
String = container.Values.StringProperties.Value?.Count ?? 0,
Integer = container.Values.IntegerProperties.Value?.Count ?? 0,
Double = container.Values.DoubleProperties.Value?.Count ?? 0,
Binary = container.Values.BinaryProperties.Value?.Count ?? 0
};
}
}
Используемые методы библиотеки
| Сервис | Метод | Назначение |
|---|---|---|
PropertyOwnerApiClient |
GetByLocation(string, CancellationToken) |
Свойства объекта по строке расположения |
Возможные ошибки
- Некорректная строка расположения — метод выбрасывает
HttpRequestException(400 Bad Request). Проверьте, что строка скопирована целиком. - Свойства не получены — выбрасывается
InvalidOperationException(ответnull). - Объект не найден — ответ
404 Not Found. - Сессия истекла — при включённом
RefreshOnUnauthorizedбиблиотека обновит токен и повторит запрос; при неудаче требуется повторный вход.
Ссылки
Пример-приложение в составе SDK: SDK/Web/Samples/Server/Samples.WebApi.GetPropertyByLocation.