0

有没有办法以编程方式从DocumentClientException哪里StatusCode == HttpStatusCode.NotFound确定是找不到文档、集合还是数据库?

我试图弄清楚我是否可以实现按需集合配置并且只DocumentClient.CreateDocumentCollectionIfNotExistsAsync在需要时调用。我试图避免在发出每个请求之前调用它(大概这会为每个请求增加额外的网络往返)。同样,当我知道它无济于事时,我试图避免在错误恢复时调用它。

通过对本地模拟器的实验,我看到在这三种情况下唯一不同的字段是DocumentClientException.Error.Message,并且仅在无法找到数据库时。我通常会尽量避免基于人类可读消息的异常分派。

错误的数据库名称:

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

正确的数据库名称,错误的集合名称:

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

正确的数据库名称、正确的集合名称、错误的文档 ID:

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

我打算使用带有自己报价的数据库。由于具有自己报价的数据库中的集合很便宜,因此我正在尝试查看是否可以将多租户应用程序中的每个租户隔离到其自己的集合中。每个租户最终都有不同的索引和默认 TTL 策略。这组集合不是固定的,并且在运行时随着新租户的注册而动态变化。我无法预测何时需要添加新系列。没有新的租户通知:我只是收到一个需要通过在可能不存在的集合中创建文档来处理的请求。有一个垃圾收集未使用的集合的过程。

我在针对 SQL API Cosmos DB 实例的 .NET Core 2.1 应用程序中使用 NuGet 包 Microsoft.Azure.DocumentDB.Core 版本 1.9.1。

4

1 回答 1

0

如果您详细查看 Message 属性,您应该会看到以下字符串,这些字符串通知是否由于 Document vs Collection 而生成了 404 Not Found 响应。

  • 资源类型:文档
  • 资源类型:集合

这并不理想,但您可以尝试从错误消息中正则表达式此信息。

于 2019-03-02T00:29:23.270 回答