Вызов Cosmos DB никогда не возвращается с асинхронным вызовом - PullRequest
0 голосов
/ 29 октября 2019

У меня есть метод в WebApi, который вызывает Cosmos через SQL API, который возвращает файлы конфигурации процесса, но никогда не вернется. Задача зависает и никогда не заканчивается. Я вижу задачу в окне Threads в Debug. Другие вызовы в тот же контейнер базы данных выполняются просто отлично. После нескольких звонков мне нужно перезапустить IIS, чтобы очистить задачи. Никаких исключений не выбрасывается. Я бегал с и без попыток ловит. Тот же метод, скопированный в другой проект консольного приложения, работает правильно. Есть ли какие-либо известные проблемы с истечением времени космоса с слишком большим результатом? Это должно вернуть только 2 предмета. Поведение такое же, как и в случае с работающей в реальном времени базой данных Cosmos DB и эмулятором Cosmos.

Я использую последний пакет Cosmos.

<package id="Microsoft.Azure.Cosmos" version="3.3.2" targetFramework="net472" />

Конструктор

client = new CosmosClient(url, primaryKey, new CosmosClientOptions()
{
    RequestTimeout = new TimeSpan(0, 0, 20),
    ApplicationRegion = "West US 2",
    ConnectionMode = ConnectionMode.Gateway,
    GatewayModeMaxConnectionLimit = 1000,
    MaxRetryAttemptsOnRateLimitedRequests = 1000,
});

database = client.GetDatabase("MyDatabase");
container = configDatabase.GetContainer("Configs");

Этот метод никогда не возвращается из await items.ReadNextAsync ()

public async Task<Dictionary<int, string>> GetConfigurationList()
{
   var values = new Dictionary<int, string>();
   var query = new QueryDefinition("SELECT c.ConfigId, c.ConfigDescription FROM c where c.DataSourceType='CSV'");

   var items = container.GetItemQueryIterator<(int ConfigId, string ConfigDescription )>(query);

   while (items.HasMoreResults)
   {
       FeedResponse<(int ConfigId, string ConfigDescription )> configs = await items.ReadNextAsync();

       foreach (var item in configs)
       {
            values.Add(item.ConfigId, item.ConfigDescription);
        }
    }
    return values;
}

Этот метод работает нормально каждый раз

public async Task<LetterConfiguration> GetConfiguration(int id)
{
  var query = new QueryDefinition("SELECT * FROM c where c.ConfigId= @id").WithParameter("@id",id);

  var configItems = container.GetItemQueryIterator<ConfigFile>(query);

  while (configItems.HasMoreResults)
  {
     FeedResponse<ConfigFile> configs = await configItems.ReadNextAsync();
     if(configs.Count == 1)
     {
        return configs.FirstOrDefault();
     }
  }
  return null;
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Это закончилось тем, что в контроллере, вызывающем метод репозитория, отсутствовало ожидание. Спасибо всем за участие.

0 голосов
/ 30 октября 2019

Пара рекомендаций:

  1. Вы проверяли, есть ли исключение при вызове ReadNextAsync? Использовать Try ... Catch

  2. Использовать типизированный объект для GetItemQueryIterator и FeedResponse

Обновление : попробуйте это для запросоввыборочные поля -

            var query = new QueryDefinition("SELECT c.ConfigId, c.ConfigDescription FROM c where c.DataSourceType='CSV'");

            var items = container.GetItemQueryStreamIterator(query);


            while (items.HasMoreResults)
            {
                using (ResponseMessage response = await items.ReadNextAsync())
                {
                    using (StreamReader sReader = new StreamReader(response.Content))
                    using (JsonTextReader jsonReader = new JsonTextReader(sReader))
                    {
                        JsonSerializer jsonSerializer = new JsonSerializer();
                        dynamic values = jsonSerializer.Deserialize<dynamic>(jsonReader).Documents;
                        Console.WriteLine($"Name: {values[0].ConfigId}");
                    }
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...