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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:35:37