Azure cosmosdb Cosmos DB对数据库的分区访问
我正在使用cosmosDB实现一个多租户应用程序。我使用分区键来分隔多个用户的数据。按照最佳实践,我试图允许每个租户拥有自己的db访问令牌 我创建一个用户和权限,并使用创建的令牌访问分区。但我得到了以下错误: 提供的分区键与集合中的定义不对应,或者与指定的分区键字段值不匹配 在文件中。 ActivityId:1659037a-118a-4a2d-8615-bb807b717fa7,Microsoft.Azure.Documents.Common/1.22.0.0,Windows/10.0.17134 documentdb netcore sdk/1.9.1 我的代码如下: 构造函数启动客户端Azure cosmosdb Cosmos DB对数据库的分区访问,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我正在使用cosmosDB实现一个多租户应用程序。我使用分区键来分隔多个用户的数据。按照最佳实践,我试图允许每个租户拥有自己的db访问令牌 我创建一个用户和权限,并使用创建的令牌访问分区。但我得到了以下错误: 提供的分区键与集合中的定义不对应,或者与指定的分区键字段值不匹配 在文件中。 ActivityId:1659037a-118a-4a2d-8615-bb807b717fa7,Microsoft.Azure.Documents.Common/1.22.0.0,Windows/10.0.171
public Projects (CosmosDbConfig cosmosConfig)
{
config = cosmosConfig;
client = new DocumentClient(new Uri(config.Endpoint), config.AuthKey);
collectionUri = UriFactory.CreateDocumentCollectionUri(config.Database, config.Collection);
config.AuthKey = GetUserToken().Result;;
client = new DocumentClient(new Uri(config.Endpoint), config.AuthKey);
}
get user函数创建用户并检索令牌。用户ID是分区键
private async Task<string> GetUserToken()
{
User user = null;
try
{
try
{
user = await client.ReadUserAsync(UriFactory.CreateUserUri(config.Database, config.PartitionKey));
var permission = await GetorCreatePermission(user, config.Collection, config.PartitionKey);
return permission.Token;
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
if (user == null)
{
user = new User
{
Id = config.PartitionKey
};
user = await client.CreateUserAsync(UriFactory.CreateDatabaseUri(config.Database), user);
var permission = await GetorCreatePermission(user, config.Collection, config.PartitionKey);
return permission.Token;
}
else
{
throw new Exception("");
}
}
catch (Exception ex)
{
throw ex;
}
}
private异步任务GetUserToken()
{
User=null;
尝试
{
尝试
{
user=wait client.ReadUserAsync(UriFactory.CreateUserUri(config.Database,config.PartitionKey));
var permission=await GetorCreatePermission(user,config.Collection,config.PartitionKey);
返回权限.令牌;
}
捕获(例外情况除外){
控制台写入线(例如消息);
}
if(user==null)
{
用户=新用户
{
Id=config.PartitionKey
};
user=wait client.CreateUserAsync(UriFactory.CreateDatabaseUri(config.Database),user);
var permission=await GetorCreatePermission(user,config.Collection,config.PartitionKey);
返回权限.令牌;
}
其他的
{
抛出新异常(“”);
}
}
捕获(例外情况除外)
{
掷骰子;
}
}
权限是针对每个集合完成的,并将集合名称作为ID保留,因为每个用户的ID都是唯一的
private async Task<Permission> GetorCreatePermission(User user,
string collection,
string paritionKey)
{
var permDefinition = new Permission
{
Id = collection,
PermissionMode = PermissionMode.All,
ResourceLink = collectionUri.OriginalString,
ResourcePartitionKey = new PartitionKey(paritionKey),
};
var perms = client.CreatePermissionQuery(user.PermissionsLink).AsEnumerable().ToList();
var perm = perms.FirstOrDefault(x => x.Id == collection);
if (perm != null)
{
return perm;
}
else
{
var result = await client.CreatePermissionAsync(user.SelfLink, permDefinition);
perm = result.Resource;
return perm;
}
}
专用异步任务GetorCreatePermission(用户,
字符串集合,
字符串分割键)
{
var permDefinition=新权限
{
Id=集合,
PermissionMode=PermissionMode.All,
ResourceLink=collectionUri.OriginalString,
ResourcePartitionKey=新的分区键(paritionKey),
};
var perms=client.CreatePermissionQuery(user.PermissionsLink.AsEnumerable().ToList();
var perm=perms.FirstOrDefault(x=>x.Id==collection);
如果(perm!=null)
{
回烫;
}
其他的
{
var result=await client.CreatePermissionAsync(user.SelfLink,permDefinition);
perm=result.Resource;
回烫;
}
}
create函数使用新客户端,这是发生错误的地方
public async Task<string> Create(Project p)
{
var result = await client.CreateDocumentAsync(collectionUri, p, new RequestOptions()
{ PartitionKey = new PartitionKey(config.PartitionKey),
});
var document = result.Resource;
return document.Id;
}
公共异步任务创建(项目p)
{
var result=await client.CreateDocumentAsync(collectionUri,p,new RequestOptions()
{PartitionKey=new PartitionKey(config.PartitionKey),
});
var document=result.Resource;
返回文件.Id;
}
由于错误表明分区键不正确,我建议您在创建集合时尝试定义分区键路径:
var docCollection = new DocumentCollection();
docCollection.Id = config.CollectionName;
docCollection.PartitionKey.Paths.Add(string.Format("/{0}", config.PartitionKey );
collectionUri = UriFactory.CreateDocumentCollectionUri(config.Database, docCollection);
谢谢,我以为这个集合有分区键,但它没有。