Microsoft.Azure.Management.Consumption .NET程序包和ApiVersion

问题描述

我正在尝试使用Microsoft.Azure.Management.Consumption 3.0.2软件包来访问使用情况和消费数据。

但是在致电UsageDetails.List时出现以下错误

当前api版本不支持订阅范围用法。请在2019-10-01之后使用api版本

是否有支持该版本的软件包的新版本(或预期会有)?

同时我还有什么选择?

我可以直接针对

https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.Consumption/usageDetails?api-version=2019-10-01

但是还有其他选择吗?

使用代码更新

请求代码

AuthenticationResult result = GetToken();
Microsoft.Rest.TokenCredentials tokenCredentials = new 
Microsoft.Rest.TokenCredentials(result.Accesstoken);
ConsumptionManagementClient client = new 
ConsumptionManagementClient(tokenCredentials);
client.SubscriptionId = "SubscriptionId I would like to check"; 

var usage = client.UsageDetails.List(); // Exception here with API Version

验证码示例:

private static AuthenticationResult GetToken()
{
    string clientId = "MyappId";

    string[] scopes = new string[] { "https://management.azure.com/.default" };
    var app = PublicclientApplicationBuilder
        .Create(clientId)
        .WithRedirectUri("https://localhost")
        .WithTenantId("TenantId I want to check")
        .Build();
    var task = app.GetAccountsAsync();
    task.Wait();
    var accounts = task.Result;
    try
    {
        var task1 = app.AcquiretokenSilent(scopes,accounts.FirstOrDefault()).ExecuteAsync();
        task1.Wait();
        return task1.Result;
    }
    catch (MsalUirequiredException)
    {
        var task2 = app.AcquiretokenInteractive(scopes).ExecuteAsync();
        task2.Wait();
        return task2.Result;
    }
}

解决方法

根据我的研究,我们可以初始化ServiceClientCredentials来创建ConsumptionManagementClient,而ServiceClientCredentials的方法ProcessHttpRequestAsync可以用来重新创建请求

例如

  1. 实施ServiceClientCredentials
class CustomLoginCredentials : ServiceClientCredentials
    {
       
        private string AuthenticationToken { get; set; }
        public override void InitializeServiceClient<T>(ServiceClient<T> client)
        {
           string clientId = "MyappId";

    string[] scopes = new string[] { "https://management.azure.com/.default" };
    var app = PublicClientApplicationBuilder
        .Create(clientId)
        .WithRedirectUri("https://localhost")
        .WithTenantId("TenantId I want to check")
        .Build();
            var task = app.GetAccountsAsync();
            task.Wait();
            var accounts = task.Result;
            try
            {
                var task1 = app.AcquireTokenSilent(scopes,accounts.FirstOrDefault()).ExecuteAsync();
                task1.Wait();
                AuthenticationToken= task1.Result.AccessToken;
            }
            catch (MsalUiRequiredException)
            {
                var task2 = app.AcquireTokenInteractive(scopes).ExecuteAsync();
                task2.Wait();
                AuthenticationToken= task2.Result.AccessToken;
            }
            
        }
        public override async Task ProcessHttpRequestAsync(HttpRequestMessage request,CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (AuthenticationToken == null)
            {
                throw new InvalidOperationException("Token Provider Cannot Be Null");
            }

            var url = request.RequestUri.ToString().Split('?')[0] + "?";
            var querys = request.RequestUri.ToString().Split('?')[1].Split('&');
            for (var i = 1; i <= querys.Length; i++)
            {

                if (querys[i - 1].StartsWith("api-version"))
                {
                    url += "api-version=2019-10-01";
                }
                else
                {
                    url += querys[i - 1];
                }


                if (i < querys.Length)
                {

                    url += "&";
                }



            }

            Console.WriteLine(url);

            request.RequestUri = new Uri(url);

            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer",AuthenticationToken);



            await base.ProcessHttpRequestAsync(request,cancellationToken);

        }



    }
  1. 获取详细信息
 var cred = new CustomLoginCredentials();
ConsumptionManagementClient client = new ConsumptionManagementClient(cred);
client.SubscriptionId = "SubscriptionId I would like to check"; 
var usage = client.UsageDetails.List();