Ошибка при попытке получить тарифную карту подписки на Azure и использование потребления

Я пытаюсь получить прейскурант и плату за подписку. Однако стабильно получаются исключения. Пробовал использовать несколько вариантов, но ни один из них не работает. Вариант 1 раньше работал безупречно, но с тех пор, как за последние 4 недели он стал ниже исключения

================================ Детали исключения ================ =================

      System.AggregateException
HResult=0x80131500
Message=One or more errors occurred.
Source=mscorlib
StackTrace:at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task1.get_Result()
Inner Exception 1:
TaskCanceledException: A task was canceled.

============== Я пробовал несколько вариантов, но ни один из них не помог. ==================

Вариант 1: аутентификация с использованием библиотеки Microsoft.IdentityModel.Clients.ActiveDirectory версии 3.13.9 и API Microsoft.Commerce ====================

          var url = "https://login.microsoftonline.com" ;
    var tenant = "mytenant.onmicrosoft.com" ;
    var resource = "https://management.core.windows.net" ;
     
    var clientSecret = "xxxx";
    var clientId = "client id of the app registerd in azure ad";
        
    var authenticationContext = 
        new AuthenticationContext(CombineUrl(url, tenant));
    ClientCredential clientCred = new ClientCredential(clientId, clientSecret);
    var authTask = 
        authenticationContext.AcquireTokenAsync(resource, clientCred);
    authTask.Wait();
    var token =  authTask.Result.Token;
            
    string  offerDurableId= "MS-AZR-0003p"; // also tried with "MS-AZR-0063p"
    string currency = "USD";
    string locale = "en-US";
    string  regionInfo =  "US"; 
    string SubscriptionId = "my subscription id"
    string APIVERSION =   "2015-06-01-preview"; 
               
    string url =  string.Format(
        "https://management.azure.com/subscriptions/{0}/providers" + `
        "/Microsoft.Commerce/RateCard?api-version={1}" + `
        "&$filter=OfferDurableId eq '{2}' and Currency eq '{3}'" + `
        "and Locale eq '{4}' and RegionInfo eq '{5}'", SubscriptionId, 
         APIVERSION, offerDurableId, currency, locale, regionInfo); `
    using (var request = new HttpRequestMessage(HttpMethod.Get, url))
    {
        var httpClient = new HttpClient() `
        request.Headers.Authorization = 
        new AuthenticationHeaderValue("Bearer", token); 
        HttpResponseMessage response = httpClient.SendAsync(request).Result; // 
        throws "task Canceled" exception
        var readTask = response.Content.ReadAsStringAsync(); `
        readTask.Wait(); `
        data= readTask.Result; `

   }

============ Вариант 2 с использованием библиотеки OAuth Microsoft.Identity.Client версии 4.31.0 и API Microsoft.Consuming

      
    var scopes = new List<string>();
    var TenantId = "tenant id as shown in azure portal for my registerd app"
    var loginAuthority = "https://login.microsoftonline.com";
    scopes.Add("https://management.azure.com/.default"); 
          
    var authResult = AuthClient.AcquireTokenForClient(scope.ToArray())
                                        .WithAuthority(loginAuthority, TenantId)
                                        .ExecuteAsync().GetAwaiter().GetResult();
        
    string token = authResult.AccessToken;
                    
    using (var request = new HttpRequestMessage(HttpMethod.Get, url))
    {
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        HttpResponseMessage response = HTTPClient.SendAsync(request).Result; // returns blank
    }

```


===============================

I have been using Option 1 in the past and it always worked, not sure what broke and need help in fixing it.








1 ответ

Решение

Не уверенный в ошибке, я предположил, что это может быть проблема с тайм-аутом, поскольку возвращаемые данные находятся в МБ. Пытался увеличить значение тайм-аута до 3 минут вместо значения по умолчанию, и это сработало. 'httpClient.TimeOut = новый TimeSpan(0,3,0);`

Протестировано несколько раз, и на данный момент он работает.

Другие вопросы по тегам