Как асинхронно отслеживать операцию покупки номера телефона Azure Communication Services с помощью пакета SDK Azure.Communication.PhoneNumbers?

Я использую версию Azure.Communication.PhoneNumbers SDK 1.1.0 для C# для покупки телефонных номеров в Azure Communication Services (ACS). Я следую этому руководству, которое показывает, как выполнить операцию покупки и дождаться результата. Этот подход работает, но операция покупки может занять от 50 секунд до более 2 минут, что слишком долго для блокировки клиента (Http-запрос).

Я хотел бы сделать эту операцию асинхронной, чтобы я мог запустить операцию покупки, а затем периодически проверять ее статус до ее завершения, позволяя клиентскому вызову завершиться после начала покупки.

Класс PurchasePhoneNumbersOperation имеет свойство HasCompleted, что означает, что я могу использовать цикл для опроса статуса в фоновом режиме. Однако было бы более эффективно периодически проверять статус с помощью клиента SDK вместо фонового цикла.

Я заметил, что у объекта операции есть метод GetRehydrationToken(). Насколько я понимаю, я потенциально мог бы использовать этот токен для последующей реконструкции объекта PurchasePhoneNumbersOperation и проверки статуса. Однако мне не удалось найти четкую документацию или примеры использования метода RehydrateAsync, который ожидает HttpPipeline.

Мои вопросы:

  1. Как я могу правильно использовать методы GetRehydrationToken() и RehydrateAsync для асинхронной проверки статуса операции покупки?
  2. Существует ли лучший подход или рекомендуемая практика для отслеживания таких длительных операций в ACS?

Любые рекомендации или примеры будут с благодарностью!

UPD: Похоже, можно получить статус операции через OperationId с помощью REST Api. Но это не поддерживается SDK.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых, начните с операции покупки номера телефона и получите объект PurchasePhoneNumbersOperation. Затем используйте метод GetRehydrationToken(), чтобы получить токен, который вы сможете использовать для повторной операции позже. Надежно храните токен (например, в базе данных), чтобы вы могли получить его позже для проверки статуса операции.

  • Используйте метод RehydrateAsync с токеном регидратации и HttpPipeline, чтобы воссоздать объект PurchasePhoneNumbersOperation и проверить его статус.

Повторно выполните операцию и проверьте состояние асинхронно:

using Azure.Communication.PhoneNumbers;
using Azure.Core.Pipeline;
using System;
using System.Threading.Tasks;

// Method to periodically check the status
public async Task CheckPurchaseStatusAsync(string rehydrationToken)
{
    var pipeline = HttpPipelineBuilder.Build(new PhoneNumbersClientOptions());
    var client = new PhoneNumbersClient("<your_connection_string>");

    // Rehydrate the operation
    PurchasePhoneNumbersOperation rehydratedOperation = PurchasePhoneNumbersOperation.RehydratePurchasePhoneNumbersOperation(rehydrationToken, pipeline);

    while (!rehydratedOperation.HasCompleted)
    {
        // Check the status (this will update the operation's state)
        await rehydratedOperation.UpdateStatusAsync();

        // Handle the status (e.g., log, notify, etc.)
        Console.WriteLine($"Status: {rehydratedOperation.Status}");

        // Wait before polling again (e.g., 10 seconds)
        await Task.Delay(TimeSpan.FromSeconds(10));
    }

    // Handle the final result
    if (rehydratedOperation.HasCompletedSuccessfully)
    {
        Console.WriteLine("Phone number purchase completed successfully.");
    }
    else
    {
        Console.WriteLine($"Phone number purchase failed with status: {rehydratedOperation.Status}");
    }
}

// Retrieve the token from storage and start checking the status
string rehydrationToken = GetTokenFromDatabase();
await CheckPurchaseStatusAsync(rehydrationToken);

Операция покупки завершена успешно:

Отлично, спасибо! Было неясно, как построить PurchasePhoneNumbersOperation с использованием РttpPipline. Было бы хорошо добавить это в документацию или в примеры SDK. Также я думаю, что клиент здесь не нужен, просто работа,

Alexander Bikkuzhin 07.08.2024 09:58

Да, мы можем игнорировать это, я только что добавил для справки, что этот клиент может быть в файле program.cs.

Suresh Chikkam 07.08.2024 10:22

Я протестировал GetReгидратationToken(), и для PurchasePhoneNumbersOperation он не реализован и возвращает ноль. Итак, единственное, что — хранить всю операцию в памяти.

Alexander Bikkuzhin 08.08.2024 11:01

Управляйте состоянием операции, сохраняя весь объект PurchasePhoneNumbersOperation в памяти. периодически проверять статус операции с использованием хранимого объекта.

Suresh Chikkam 08.08.2024 11:28

Да, к такому выводу мы пришли в нашей команде и сейчас так поступаем.

Alexander Bikkuzhin 09.08.2024 09:37
Ответ принят как подходящий

После некоторого расследования я протестировал GetReгидратationToken(), и для PurchasePhoneNumbersOperation он не реализован и возвращает ноль. Таким образом, единственный способ отслеживать статус операции — хранить весь объект операции в памяти и при необходимости вызывать UpdateStatus().

Другие вопросы по теме

Невозможно прочитать большие двоичные объекты через BlobContainerClient для больших двоичных объектов с пустыми префиксами папок
Как в настоящее время работают перенаправления привязки для плагинов ExcelDNA?
Имитируйте метод EncryptAsync и возвращайте EncryptResult из Azure.Security.KeyVault.Keys.Cryptography
Azure SDK .NET — пакетное удаление больших двоичных объектов с помощью SAS
Как получить токен управления Azure и вызвать HTTP в .NET для проверки доступности доменного имени Azure B2C?
Как убедиться, что доменное имя еще не занято перед созданием клиента Azure B2C?
Есть ли в Azure SDK для .NET атрибут или набор атрибутов, позволяющий определить, является ли конвейер классическим или использует YAML?
Как лучше всего загрузить сериализованный IAsyncEnumerable в хранилище BLOB-объектов Azure?
Запуск конвейера YAML с помощью C# Azure DevOps SDK
Как использовать управляемую идентификацию для аутентификации вызовов Azure REST API с помощью Azure SDK