You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Azure.Communication.PhoneNumbers SDK异步跟踪ACS购号操作?

问题描述

我正在使用C#版本的Azure.Communication.PhoneNumbers SDK(版本1.1.0)在Azure Communication Services(ACS)中购买电话号码。按照官方示例实现购号并等待结果的方法可行,但购号操作耗时50秒至2分钟以上,会阻塞客户端HTTP请求。

我希望将此操作改为异步模式:启动购号操作后立即结束客户端请求,之后定期检查操作状态直至完成。

PurchasePhoneNumbersOperation类有HasCompleted属性,我可以用后台循环轮询状态,但想通过SDK客户端实现更高效的检查方式。我注意到操作对象有GetRehydrationToken()方法,推测可通过该令牌重建PurchasePhoneNumbersOperation对象来后续检查状态,但找不到使用RehydrateAsync方法(需传入HttpPipeline)的清晰文档或示例。

我的问题:

  1. 如何正确使用GetRehydrationToken()和RehydrateAsync方法异步检查购号操作状态?
  2. 在ACS中跟踪此类长运行操作是否有更优方法或推荐实践?

更新:发现可通过OperationId调用REST API获取操作状态,但当前SDK暂不支持此方式。


解决方案

1. 使用重hydration令牌跟踪操作状态

步骤1:启动购号并保存令牌

发起购号请求时,获取操作实例并保存其重hydration令牌,可将令牌存储到数据库或缓存中留待后续使用:

// 初始化PhoneNumbersClient
var client = new PhoneNumbersClient(new Uri("https://<你的ACS资源地址>.communication.azure.com/"), new AzureKeyCredential("<你的访问密钥>"));

// 发起购号操作(传入搜索得到的ID)
var purchaseOperation = await client.StartPurchasePhoneNumbersAsync("<电话号码搜索ID>");

// 保存重hydration令牌
string rehydrationToken = purchaseOperation.GetRehydrationToken();

步骤2:重建实例并轮询状态

在后台任务或定时逻辑中,用保存的令牌重建操作实例,然后定期更新状态直到完成:

// 重新初始化客户端
var client = new PhoneNumbersClient(new Uri("https://<你的ACS资源地址>.communication.azure.com/"), new AzureKeyCredential("<你的访问密钥>"));

// 从令牌重建PurchasePhoneNumbersOperation实例
var purchaseOperation = await PurchasePhoneNumbersOperation.RehydrateAsync(rehydrationToken, client.Pipeline, client.Endpoint);

// 轮询状态
while (!purchaseOperation.HasCompleted)
{
    await Task.Delay(TimeSpan.FromSeconds(10)); // 根据实际情况调整轮询间隔
    await purchaseOperation.UpdateStatusAsync(); // 更新操作状态
}

// 处理结果
if (purchaseOperation.HasSucceeded)
{
    var purchasedNumbers = purchaseOperation.Value;
    // 执行购号成功后的逻辑
}
else
{
    var error = purchaseOperation.Error;
    // 处理购号失败的情况
}

说明:RehydrateAsync需要的HttpPipeline和Endpoint参数,可直接从初始化后的PhoneNumbersClient实例中获取。

2. ACS长运行操作跟踪推荐实践

  • 控制轮询频率:根据购号操作的平均耗时,设置10-30秒的轮询间隔,避免高频请求浪费资源。
  • 后台异步处理:将状态检查逻辑放到后台服务(如ASP.NET Core的Hosted Service)中,不要阻塞用户前端请求。
  • 持久化操作信息:将重hydration令牌或OperationId存入可靠存储(如SQL数据库、Redis),确保服务重启后能继续跟踪进度。
  • 备选REST API方案:如果SDK的重hydration方式不满足需求,可直接构造HTTP请求调用ACS的操作状态查询接口,传入OperationId即可获取状态(需配置正确的身份验证头部)。

内容的提问来源于stack exchange,提问作者Alexander Bikkuzhin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:42:11