如何在.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
相关产品推荐
相关产品推荐

