c# - 区分 Cosmos DB 中的唯一约束违规

标签 c# azure azure-cosmosdb-sqlapi

我创建了一个 Cosmos DB 集合来存储用户。该集合对电子邮件地址有唯一的限制。用户的 id 是一个 Guid。当我将用户添加到集合中时,当 Guid 已经存在以及电子邮件地址已经存在时,会引发 HttpStatusCode Conflict 异常。 有没有办法知道哪个约束导致了错误?

独特的约束是这样添加的:

myCollection.UniqueKeyPolicy = new UniqueKeyPolicy
{
    UniqueKeys =
    new Collection<UniqueKey>
    {
        new UniqueKey { Paths = new Collection<string> { "/EmailAddress/Address" }},
    }
};

调用 CreateDocumentAsync 后发生(预期的)异常,我捕获如下异常:

catch (DocumentClientException e)
{
    if (e.StatusCode == System.Net.HttpStatusCode.Conflict)
    {
        // I can't find anything in the Exception that indicates what constraint was violated
    }
}

e.Error 包含:

{  
   "code":"Conflict",
   "message":"Message: {\"Errors\":[\"Unique index constraint violation.\"]}\r\nActivityId: 3....6, Request URI: /apps/3....b/services/9....f/partitions/b....4/replicas/131903490859125028p/, RequestStats: \r\nRequestStartTime: 2018-12-27T15:56:06.4927341Z, Number of regions attempted: 1\r\n, SDK: Microsoft.Azure.Documents.Common/2.1.0.0"
}

我想要区分的原因是这样我可以向客户端返回更好的消息。我知道 Guid 通常是唯一的,但客户端可以在现有实体上调用 CreateDocumentAsync。另外,在另一种情况下,我可能需要对集合进行多个唯一约束。

有什么想法吗?

最佳答案

试试这个:

            catch ( Microsoft.Azure.Documents.DocumentClientException ex )
        {

           if ( ex.StatusCode == System.Net.HttpStatusCode.Conflict )
           {

              // Unique key constraint violation ...

           }
           else
           {

              // Some other issue ...
              throw;

           }

How to check for unique key constraint violations / exceptions

产品组更新:

目前我们不公开子状态代码来区分 ID 冲突和唯一冲突(甚至更详细地说这种唯一冲突涉及哪种唯一索引)。正如所建议的,可以使用错误消息文本。

建议的解决方法:

409 由于唯一索引约束违规示例: {"code":"冲突","message":"消息: {\"错误\":[\"违反唯一索引约束。\"]} ... StatusCode: 冲突"...}

由于 ID 重复而导致 409: {"code":"冲突","message":"消息: {\"错误\":[\"具有指定 ID 或名称的资源已存在。\"]} ... StatusCode: 冲突"...}

Screen capture showing clarity for parsing text from exception.

关于c# - 区分 Cosmos DB 中的唯一约束违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53947865/

相关文章:

c# - 文本文件中的换行符 (C#)

c# - 事务批处理 cosmos - 如果在分区中读取特定值则写入

azure - 获取数组中包含具有特定电子邮件的项目的所有记录

c# - 来自 Azure Blob 下载图像的链接,但我只需要观看(Asp.NET Core)

video - 如何在 Azure 上的 MVC 应用程序中托管和嵌入视频?

php - 在 Azure 中运行 Fuel Php

azure-cosmosdb - 如何编写 Azure Cosmos COUNT DISTINCT 查询

c# - 在屏幕键盘显示时调整 winrt 页面大小

c# - 升级到 Azure SDK 1.7 但 TransientFaultHandling.RetryPolicy 仍查找 1.1

C# 编码 char** 和 unsigned char**