Azure Cosmos DB - проверьте, если элемент не существует, не выдавая ошибку в Application Insights - PullRequest
3 голосов
/ 11 февраля 2020

Я создал простое приложение API отслеживания игроков в ASP. NET Core 3.1, которое использует Azure Cosmos DB в качестве внутреннего интерфейса.

API для создания новой записи игрока сначала проверяет, существует ли запись с таким же идентификатором под данным ключом раздела в базе данных Cosmos, используя это:

try
{
    ItemResponse<Player> response = await this._playerContainer.ReadItemAsync<Player>(playerid, new PartitionKey(partitionkey));
    return Conflict();
}
catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
    // There is some more logic happening here so I cannot directly just call CreateItemAsync()... and return the Conflict response that this might return.
    ItemResponse<GameResult> response = await this._gameResultContainer.CreateItemAsync<GameResult>(gameresult, new PartitionKey(gameresult.PlayerId));
    // ...        
    return Accepted();
}

Только если это ничего не возвращает Я впереди go и помещаю запрос на создание в рабочую очередь бэкэнда. В противном случае я возвращаю 409-Conflict вызывающей стороне API.

Фактическая вставка происходит в asyn c бэкэнд-работнике. Но я хочу вернуться к вызывающему API напрямую, если его вставка будет успешной.

Пока все работает нормально. Проблема, с которой я столкнулся, заключается в следующем: поскольку я использую Azure Application Insights SDK, любой вызов, который не находит существующий элемент (что должно быть обычным случаем здесь), автоматически создает ошибку в AppInsights - даже если я поймать исключение в моем коде. Это, очевидно, немного загромождает мою регистрацию.

Есть идеи, как мне от этого избавиться или вообще как изменить API, чтобы получить лучшее поведение для этого?

1 Ответ

3 голосов
/ 11 февраля 2020

Проблема на стороне Cosmos DB. NET SDK. Выдает исключение, если документ не найден. Они не могут реально изменить это поведение, потому что клиенты полагаются на это. GitHub Issue

Предлагаемое решение заключается в использовании низкоуровневого Stream API . Таким образом, вы сможете справиться с 404 поведением на вашей стороне.

Примерно так:

    using (ResponseMessage responseMessage = await container.ReadItemStreamAsync(
        partitionKey: new PartitionKey(partitionkey),
        id: playerid))
    {
        if (responseMessage.StatusCode == System.Net.HttpStatusCode.NotFound)
        {
            ...
            return Accepted();
        }

        if (responseMessage.IsSuccessStatusCode)
        {
            return Conflict();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...