如何使用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)的清晰文档或示例。
我的问题:
- 如何正确使用
GetRehydrationToken()和RehydrateAsync方法异步检查购号操作状态? - 在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
相关产品推荐
相关产品推荐

