API прейскуранта Майкрософт не работает. Возврат частичного ответа

Я пытаюсь получить сведения о ценах на свою подписку, обратившись к API management.azure.com. Согласно документации здесь: https://docs.microsoft.com/en-us/previous-versions/azure/reference/mt219004(v=azure.100)?redirectedfrom=MSDN

Я попытался использовать API с предоставленным кодом, Postman и сторонней библиотекой (https://github.com/codehollow/AzureBillingApi/), что привело к плохому ответу, который невозможно десериализовать.

Протокод выглядит следующим образом:

      AzureCredentials credentials = credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(
                clientId, clientSecret, tenantId, AzureEnvironment.AzureGlobalCloud).WithDefaultSubscription(subscriptionId);

ServiceClientCredentials serviceClientCredentials = await await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, clientSecret);

string urlString = @$"https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Commerce/RateCard?api-version=2016-08-31-preview&$filter=OfferDurableId eq 'MS-AZR-0003p' and Currency eq 'USD' and Locale eq 'en-US' and RegionInfo eq 'US' and MeterCategory eq 'Storage'";

using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, urlString))
{
     await serviceClientCredentials.ProcessHttpRequestAsync(requestMessage, CancellationToken.None);

     using (HttpClient client = new HttpClient())
     {
          HttpResponseMessage responseMessage = await client.SendAsync(requestMessage);

          if(!responseMessage.IsSuccessStatusCode)
               throw new InvalidOperationException(responseMessage.ReasonPhrase);

          string contentString = await responseMessage.Content.ReadAsStringAsync();
          RateCardResponse rateCardResponse =   JsonConvert.DeserializeObject<RateCardResponse>(contentString);
     }
}

Пока я получаю действительный ответ (200), переменная contentString недействительна JSON. Пример сокращен для удобства чтения.

      {
    "OfferTerms": [],
    "Meters": [
        {
            "EffectiveDate": "2020-05-01T00:00:00Z",
            "IncludedQuantity": 0.0,
            "MeterCategory": "Virtual Machines",
            "MeterId": "cd2d7ca5-2d4c-5f93-94d0-8cee0662c71c",
            "MeterName": "E20 v4",
            "MeterRates": {
                "0": 1.52
            },
            "MeterRegion": "AP Southeast",
            "MeterStatus": "Active",
            "MeterSubCategory": "Ev4 Series",
            "MeterTags": [],
            "Unit": "1 Hour"
        },
        {
            "EffectiveDate": "2020-11-01T00:00:00Z",
            "IncludedQuantity": 0.0,
            "MeterCategory": "Virtual Machines Licenses",
            "MeterId": "e8ceef66-d651-5a3c-9af9-046917e3a466",
            "MeterName": "104 vCPU License",
            "MeterRates": {
                "0": 1.456
            },
            "MeterRegion": <ACTUAL RESPONSE IS 627,746 bytes but always cuts off at this point>

Этот сайт ( https://azureprice.net/ ), похоже, извлекает последние данные из того же API без проблем, но я в тупике, почему мой ответ обрезан и недействителен.

1 ответ

Я только что снова запустил этот код, с потоковым считывателем и без него, и он отлично работает. Я предполагаю, что у людей из Microsoft была проблема, и они исправили ее. По-прежнему нет возможности фильтрации, но я могу сделать это на стороне клиента.

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