Azure.ResourceManager.GetResourceGroups返回空,无法查找Search服务问题
解决Azure Resource Manager SDK获取资源组为空的问题
你的代码中使用新的Azure Resource Manager SDK(Azure.ResourceManager.Resources)时,调用Subscription.GetResourceGroups()返回空集合,导致无法找到目标Search服务,核心原因和解决办法如下:
核心问题
新Arm SDK的GetResourceGroups()、GetSearchServices()返回的是AsyncPageable<T>类型,这是异步分页枚举对象,直接用普通foreach不会触发实际的API请求,自然拿不到数据。而旧的Microsoft.Azure.Management.Search SDK中的ListBySubscription()是同步拉取全部结果,所以能正常获取服务。
解决方案
方案1:直接遍历订阅下所有Search服务(推荐)
没必要遍历所有资源组,直接通过订阅获取所有Search服务,效率更高且避免遍历资源组的问题:
else { var tokenCredential = credentialFactory.AcquireTokenCredential(Common.SystemConstants.Security.AzureManagementEndpoint); var armClient = new ArmClient(tokenCredential, subscriptionId); var subscription = await armClient.GetDefaultSubscriptionAsync(); // 直接获取订阅下所有Search服务 AsyncPageable<SearchServiceResource> allSearchServices = subscription.GetSearchServicesAsync(); await foreach (var searchService in allSearchServices) { if (searchService.Data.Name.Equals(serviceName, StringComparison.OrdinalIgnoreCase)) { var adminKeys = await searchService.GetAdminKeyAsync(); return adminKeys.Value.PrimaryKey; } } throw new InvalidOperationException($"无法在订阅 {subscriptionId} 中找到服务 {serviceName}。"); }
方案2:正确遍历资源组(异步处理)
如果必须通过资源组遍历,需要使用await foreach来处理异步枚举,触发实际API请求:
else { var tokenCredential = credentialFactory.AcquireTokenCredential(Common.SystemConstants.Security.AzureManagementEndpoint); var armClient = new ArmClient(tokenCredential, subscriptionId); var subscription = await armClient.GetDefaultSubscriptionAsync(); // 使用await foreach遍历异步分页的资源组 AsyncPageable<ResourceGroupResource> resourceGroups = subscription.GetResourceGroupsAsync(); await foreach (var resourceGroup in resourceGroups) { // 同样用await foreach遍历资源组下的Search服务 AsyncPageable<SearchServiceResource> searchServices = resourceGroup.GetSearchServicesAsync(); await foreach (var searchService in searchServices) { if (searchService.Data.Name.Equals(serviceName, StringComparison.OrdinalIgnoreCase)) { var adminKeys = await searchService.GetAdminKeyAsync(); return adminKeys.Value.PrimaryKey; } } } throw new InvalidOperationException($"无法在订阅 {subscriptionId} 中找到服务 {serviceName}。"); }
额外检查
- 确认TokenCredential拥有足够权限:需要
Microsoft.Search/searchServices/read和Microsoft.Search/searchServices/listAdminKeys/action权限,权限范围要覆盖目标订阅。 - 服务名称匹配时建议使用
StringComparison.OrdinalIgnoreCase,避免大小写问题导致匹配失败。
内容的提问来源于stack exchange,提问作者Jonas Arcangel
相关产品推荐
相关产品推荐

