Table of Contents

Получение свойств объекта по расположению

Пример показывает, как получить свойства объекта структуры по строке расположения средствами клиентской библиотеки Ascon.Polynom.Web.Api.Client. Проект — Samples.WebApi.GetPropertyByLocation.

Требования

  • .NET 8.
  • Запущенный web-сервер ПОЛИНОМ:MDM с доступным хранилищем.
  • Пакет Ascon.Polynom.Web.Api.Client из локального фида (подключается автоматически).

Алгоритм

  1. Получить строку расположения объекта.
  2. Авторизоваться в web-API.
  3. Запросить свойства объекта по расположению.
  4. Обработать и сохранить результат.
  5. Выйти из сессии.

Получение строки расположения

Строка расположения берётся из клиента ПОЛИНОМ: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.