Как вызвать Azure Rest API на C #

Я новичок в мире C #. У меня есть проект, в котором мне нужно собрать квоты использования вычислений Azure для всех регионов из 700+ подписок. Я легко сделал это с помощью PowerShell (Get-AzVMUsage).

Я должен делать это на C #. Думаю, мне нужно использовать для этого Rest API. (Я открыт для другого способа добиться этого).

API Azure Rest: 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.


person Vinny    schedule 22.05.2020    source источник


Ответы (2)


Я погуглил и выяснил, как это сделать по адресу ниже.

https://docs.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;
        }
    }
}

person Vinny    schedule 23.05.2020

System.Net.HttpClient здесь ваш друг:

using System.Net.Http;
using System.Threading.Tasks;

namespace Sandbox
{
    public class SampleCall
    {
        static async Task<string> CallApi()
        {
            var subscriptionId = "subscriptionIdHere";
            var location = "locationHere";
            var uri = $"https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/usages?api-version=2019-12-01";

            using var client = new HttpClient();
            var response = await client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }

            return string.Empty;
        }
    }
}

Использование :

var content = await SampleCall.CallApi();
person Heikki    schedule 22.05.2020