Я использую версию Azure.Communication.PhoneNumbers
SDK 1.1.0
для C# для покупки телефонных номеров в Azure Communication Services
(ACS). Я следую этому руководству, которое показывает, как выполнить операцию покупки и дождаться результата. Этот подход работает, но операция покупки может занять от 50 секунд до более 2 минут, что слишком долго для блокировки клиента (Http-запрос).
Я хотел бы сделать эту операцию асинхронной, чтобы я мог запустить операцию покупки, а затем периодически проверять ее статус до ее завершения, позволяя клиентскому вызову завершиться после начала покупки.
Класс PurchasePhoneNumbersOperation
имеет свойство HasCompleted
, что означает, что я могу использовать цикл для опроса статуса в фоновом режиме. Однако было бы более эффективно периодически проверять статус с помощью клиента SDK вместо фонового цикла.
Я заметил, что у объекта операции есть метод GetRehydrationToken()
. Насколько я понимаю, я потенциально мог бы использовать этот токен для последующей реконструкции объекта PurchasePhoneNumbersOperation
и проверки статуса. Однако мне не удалось найти четкую документацию или примеры использования метода RehydrateAsync
, который ожидает HttpPipeline
.
Мои вопросы:
GetRehydrationToken()
и RehydrateAsync
для асинхронной проверки статуса операции покупки?Любые рекомендации или примеры будут с благодарностью!
UPD: Похоже, можно получить статус операции через OperationId с помощью REST Api. Но это не поддерживается SDK.
Во-первых, начните с операции покупки номера телефона и получите объект 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);
Операция покупки завершена успешно:
Да, мы можем игнорировать это, я только что добавил для справки, что этот клиент может быть в файле program.cs.
Я протестировал GetReгидратationToken(), и для PurchasePhoneNumbersOperation он не реализован и возвращает ноль. Итак, единственное, что — хранить всю операцию в памяти.
Управляйте состоянием операции, сохраняя весь объект PurchasePhoneNumbersOperation
в памяти. периодически проверять статус операции с использованием хранимого объекта.
Да, к такому выводу мы пришли в нашей команде и сейчас так поступаем.
После некоторого расследования я протестировал GetReгидратationToken(), и для PurchasePhoneNumbersOperation
он не реализован и возвращает ноль. Таким образом, единственный способ отслеживать статус операции — хранить весь объект операции в памяти и при необходимости вызывать UpdateStatus().
Отлично, спасибо! Было неясно, как построить PurchasePhoneNumbersOperation с использованием РttpPipline. Было бы хорошо добавить это в документацию или в примеры SDK. Также я думаю, что клиент здесь не нужен, просто работа,