如何在 C# 中调用 Azure Rest API

Vin*_*nny 5 c# azure azure-rest-api

我是 C# 世界的新手。我有一个项目,需要从 700 多个订阅中收集所有区域的 Azure 计算使用配额。我已经使用 PowerShell (Get-AzVMUsage) 轻松完成了此操作。

我必须使用 C# 来完成。我想我需要使用 Rest API 来实现它。(我愿意以另一种方式来实现这一目标)。

Azure 休息 API:GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/usages?api-version=2019-12-01

如何使用上述 Rest API 获取结果?一旦我从此 Rest API 获得结果,我就可以将业务逻辑置于其之上以执行数据聚合,并通过 700 多个订阅进行循环,并将数据转储到 SQL-MI 中。

Vin*_*nny 7

我用谷歌搜索并从下面的网址找到了方法。

https://learn.microsoft.com/en-us/archive/blogs/benjaminperkins/how-to-securely-connect-to-azure-from-c-and-run-rest-apis MSDN 论坛

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Newtonsoft.Json;

namespace AzureCapacityUsage
{
    class Program
    {
        static async Task Main()
        {            
            try 
            {
                string token = await GetAccessToken(TenantID,ClientID,Password); 
                await GetResults(token);              
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex.Message}");
            }
        }

        private static async Task<string> GetResults(string token)
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://management.azure.com/subscriptions/")
            };

            string URI = $"{SubscriptionGUID}/providers/Microsoft.Compute/locations/{Region}/usages?api-version=2019-12-01";

            httpClient.DefaultRequestHeaders.Remove("Authorization");
            httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
            HttpResponseMessage response = await httpClient.GetAsync(URI);

            var HttpsResponse = await response.Content.ReadAsStringAsync();
            var JSONObject =  JsonConvert.DeserializeObject<object>(HttpsResponse);
            
            Console.WriteLine(JSONObject);
            var JSONObj = new JavaScriptSerializer().Deserialize<Dictionary<string, string>>(JSONObject);
            return response.StatusCode.ToString();

        }
        private static async Task<string> GetAccessToken(string tenantId, string clientId, string clientKey)
        {
            Console.WriteLine("Begin GetAccessToken");

            string authContextURL = "https://login.windows.net/" + tenantId;
            var authenticationContext = new AuthenticationContext(authContextURL);
            var credential = new ClientCredential(clientId, clientKey);
            var result = await authenticationContext

            .AcquireTokenAsync("https://management.azure.com/", credential);
            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }
            string token = result.AccessToken;
            return token;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 3

Vinny的答案不再得到支持。自 2022 年 12 月起,不再支持Microsoft.IdentityModel.Clients.ActiveDirectory与 一起使用的 Nuget 。AuthenticationContext

我们可以使用Azure.IdentityNuget,然后用这个替换 GetAccessToken 方法...

private static async Task<string> GetAccessToken(string tenantId, string clientId, string clientKey)
{
    Console.WriteLine("Begin GetAccessToken");

    var credentials = new ClientSecretCredential(tenantId, clientId, clientKey);
    var result = await credentials.GetTokenAsync(new TokenRequestContext(new[] { "https://management.azure.com/.default" }), CancellationToken.None);
    return result.Token;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,使用 SDK 可能会更容易。我写了一篇关于 SDK 和 Rest API 的博客文章,您可能会觉得有用。