Azure Functions v4绑定CosmosDB提示无法绑定DocumentClient类型错误求解
报错原因
- Azure Functions v4配套的Cosmos DB v4版本扩展已经完全弃用了旧版Cosmos DB v2 SDK中的
Microsoft.Azure.Documents.Client.DocumentClient类型,改为使用Cosmos DB v3 SDK提供的Microsoft.Azure.Cosmos.CosmosClient作为绑定的客户端类型,你当前代码中还在使用已不被支持的DocumentClient进行绑定,所以触发索引报错。 - 旧版本的Functions + Cosmos DB扩展包兼容
DocumentClient绑定,所以你之前在.NET Core 3.1的旧环境可以正常运行。
解决步骤
- 确认你的项目已经正确安装了4.x版本的
Microsoft.Azure.WebJobs.Extensions.CosmosDB扩展包,引用命名空间改为Microsoft.Azure.Cosmos,移除旧的Microsoft.Azure.Documents.Client相关引用。 - 修改Run方法中Cosmos DB的绑定类型,将
DocumentClient替换为CosmosClient:
public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "policy")] HttpRequest req, [CosmosDB(Connection = "CosmosConnectionString")] CosmosClient cosmos, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); var query = "SELECT * FROM Policy"; var policies = GetDocumentsByQuery( cosmos, "AR", "Policy", query).ToList(); return new OkObjectResult(policies); }
- 同步修改
GetDocumentsByQuery方法,适配CosmosClient的API逻辑:
public static List<dynamic> GetDocumentsByQuery(CosmosClient cosmos, string database, string container, string query, string partitionKey = null) { try { QueryRequestOptions queryOptions; if (partitionKey == null) { queryOptions = new QueryRequestOptions { EnableCrossPartitionQuery = true, PopulateIndexMetrics = true }; } else { queryOptions = new QueryRequestOptions { PartitionKey = new PartitionKey(partitionKey), PopulateIndexMetrics = true }; } var containerClient = cosmos.GetDatabase(database).GetContainer(container); var queryDefinition = new QueryDefinition(query); var queryIterator = containerClient.GetItemQueryIterator<dynamic>(queryDefinition, requestOptions: queryOptions); var results = new List<dynamic>(); while (queryIterator.HasMoreResults) { var response = queryIterator.ReadNextAsync().GetAwaiter().GetResult(); results.AddRange(response); } return results; } catch (Exception) { throw; } }
内容的提问来源于stack exchange,提问作者nana
相关产品推荐
相关产品推荐

