gpt4 book ai didi

c# - Azure Cosmos DB - 检查项目是否不存在,而不向 Application Insights 抛出错误

转载 作者:行者123 更新时间:2023-12-05 00:10:41 26 4
gpt4 key购买 nike

我在 ASP.NET Core 3.1 中构建了一个简单的玩家跟踪 API 应用程序,该应用程序使用 Azure Cosmos DB 作为后端。

创建新玩家条目的 API 首先使用以下命令检查 Cosmos DB 中是否已存在给定分区键下具有相同 ID 的条目:

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();
}

仅当此操作不返回任何内容时,我才会继续将创建请求放入后端工作队列中。否则,我将向 API 调用者返回 409-冲突。

实际插入发生在异步后端工作程序中。但我想直接返回 API 调用者,如果他的插入成功的话。

到目前为止一切正常。我遇到的问题如下:当我使用 Azure Application Insights SDK 时,任何找不到现有项目的调用(这应该是这里的正常情况)都会自动在 AppInsights 中创建一个错误 - 即使我捕获了我的代码中出现异常。这显然让我的日志记录变得相当困惑。

知道如何摆脱这个问题,或者一般如何更改 API 以获得更好的行为吗?

最佳答案

问题出在 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();
}
}

sample code in the repo for doing custom deserialization

关于c# - Azure Cosmos DB - 检查项目是否不存在,而不向 Application Insights 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60165952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com