Определите, обнаружен ли Cosmos DB NotFound из-за отсутствия коллекции по сравнению с документом

Есть ли способ программно определить по DocumentClientException где StatusCode == HttpStatusCode.NotFound, был ли документ, коллекция или база данных не найдены?

Я пытаюсь понять, могу ли я реализовать подготовку коллекции по требованию и вызывать DocumentClient.CreateDocumentCollectionIfNotExistsAsync только тогда, когда мне нужно. Я пытаюсь не вызывать его перед каждым запросом (по-видимому, это добавляет дополнительный сетевой обход для каждого запроса). Точно так же я стараюсь не вызывать его при восстановлении после ошибок, когда знаю, что это не поможет.

По результатам экспериментов с локальным эмулятором, единственное поле, которое я вижу, меняется в этих трех случаях, - это DocumentClientException.Error.Message, и только тогда, когда не удается найти базу данных. Обычно я стараюсь избегать отправки исключений на основе удобочитаемых сообщений.

Неверное имя базы данных:

  • StatusCode: HttpStatusCode.NotFound
  • Error.Message: {\"Errors\":[\"Owner resource does not exist\"]}...

Правильное название базы данных, неправильное название коллекции:

  • StatusCode: HttpStatusCode.NotFound
  • Error.Message: {\"Errors\":[\"Resource Not Found\"]}...

Правильное имя базы данных, правильное название коллекции, неправильный идентификатор документа:

  • StatusCode: HttpStatusCode.NotFound
  • Error.Message: {\"Errors\":[\"Resource Not Found\"]}...

Я планирую использовать базу данных с собственным предложением. Поскольку коллекции внутри базы данных с собственным предложением дешевы, я пытаюсь проверить, может выделить каждого арендатора в моем мультитенантном приложении в его собственную коллекцию. У каждого клиента своя политика индексирования и TTL по умолчанию. Набор коллекций не является фиксированным и динамически изменяется во время выполнения по мере регистрации новых клиентов. Я не могу предсказать, когда мне нужно будет добавить новую коллекцию. Уведомления о новом клиенте нет: я просто получаю запрос, который мне нужно обработать, создав документ в, возможно, несуществующей коллекции. Есть процесс сбора неиспользуемых коллекций мусора.

Я использую пакет NuGet Microsoft.Azure.DocumentDB.Core версии 1.9.1 в приложении .NET Core 2.1, ориентированном на экземпляр SQL API Cosmos DB.


person chwarr    schedule 30.08.2018    source источник
comment
Почему вы не вызываете DocumentClient.CreateDocumentCollectionIfNotExistsAsync при инициализации DocumentClient? В любом случае это должен быть синглтон.   -  person Nick Chapsas    schedule 30.08.2018
comment
@NickChapsas: обновленный вопрос с пояснением, почему я изучаю создание коллекции по запросу.   -  person chwarr    schedule 30.08.2018


Ответы (1)


Если вы посмотрите на свойство Message подробно, вы должны увидеть следующие строки, которые информируют, был ли сгенерирован ответ 404 Not Found из-за Document vs Collection.

  • ResourceType: документ
  • ResourceType: Коллекция

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

person Abhinav Ghai    schedule 02.03.2019
comment
Пример RegEx будет хорошим дополнением к этому ответу. - person rhand; 02.03.2019