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

如何在.NET Core 6 API中调用Azure REST API并获取一致响应

问题分析与解决方案

你当前的代码存在两个核心问题:返回类型不匹配的编译错误,以及同步调用异步方法的不良实践;同时Azure SDK的使用流程可能存在偏差。以下分两种方案给出修正方案:


一、修复RestClient实现

1. 修正AccessToken获取函数(改为异步非阻塞)

原代码使用.Result同步阻塞异步方法,容易引发死锁问题,改为异步模式:

public async Task<string> GetAccessTokenAsync(string tenantID)
{
    var _config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
    var scopes = new string[] { _config["Azure:vm-executer:scope"]! };

    var confidentialClientApplication = ConfidentialClientApplicationBuilder
     .Create(_config["Azure:vm-executer:client_id"])
     .WithTenantId(tenantID)
     .WithClientSecret(_config["Azure:vm-executer:client_secret"])
     .WithAuthority($"https://login.microsoftonline.com/{tenantID}/oauth2/v2.0/token")
     .Build();

    var result = await confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();

    return result.AccessToken;
}

2. 修正订阅列表获取函数

原函数返回类型声明与实际返回值不匹配,需定义对应数据模型并完成反序列化:

// 定义Azure订阅列表的响应模型
public class SubscriptionListResponse
{
    public List<SubscriptionInfo> Value { get; set; }
}

public class SubscriptionInfo
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string DisplayName { get; set; }
    public string State { get; set; }
}

public async Task<SubscriptionListResponse> GetSubscriptionsAsync(string accessToken)
{
    var uri = "https://management.azure.com/subscriptions?api-version=2020-01-01";
    var client = new RestClient();
    var request = new RestRequest(uri, Method.Get);
    request.AddHeader("Authorization", $"Bearer {accessToken}");
    
    RestResponse response = await client.ExecuteAsync(request);
    
    if (!response.IsSuccessful)
    {
        throw new HttpRequestException($"请求失败: {response.StatusCode} - {response.Content}");
    }
    
    // 反序列化JSON响应到模型(忽略大小写匹配)
    return JsonSerializer.Deserialize<SubscriptionListResponse>(response.Content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
}

二、Azure.ResourceManager SDK正确使用方式

官方SDK无需手动管理令牌,更稳定易用,之前失败大概率是初始化流程错误:

1. 安装依赖NuGet包

Install-Package Azure.ResourceManager
Install-Package Azure.Identity

2. 实现订阅列表获取代码

public async Task<List<SubscriptionResource>> GetAllSubscriptionsAsync(string tenantId)
{
    var _config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
    var clientId = _config["Azure:vm-executer:client_id"];
    var clientSecret = _config["Azure:vm-executer:client_secret"];

    // 创建服务主体凭据
    var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
    // 初始化Azure资源管理客户端
    var armClient = new ArmClient(credential);

    // 获取所有订阅资源
    var subscriptions = await armClient.GetSubscriptions().GetAllAsync().ToListAsync();
    
    return subscriptions;
}

关键注意事项

  • 确保你的Service Principal已在根租户/管理组级别分配了订阅读取者或更高权限,否则无法跨租户访问订阅。
  • 全程使用async/await异步模式,避免同步阻塞调用。
  • SDK会自动处理令牌的获取、刷新,无需手动维护AccessToken。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:55:26