我创建了一个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。另外,在另一种情况下,我可能希望集合具有多个唯一约束。
有什么想法吗?
答案 0 :(得分:0)
尝试一下:
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由于违反了唯一索引约束示例: {“代码”:“冲突”,“消息”:“消息:{\”错误\“:[\”唯一索引约束冲突。“”“} ...状态代码:冲突” ...}
409由于重复的ID: {“代码”:“冲突”,“消息”:“消息:{\”错误\“:[\”具有指定ID或名称的资源已存在。\“]} ...状态代码:冲突” ...}