配置Azure Function CosmosDB输出绑定(托管标识)遇.NET程序集错误
NodeJS Azure Function v4扩展使用MSI连接Cosmos DB时出现.NET程序集错误
问题背景
我在项目中使用NodeJS 16版本的Azure Function,由Blob创建事件触发,需提取信息并通过Cosmos DB输出绑定保存数据。最初使用连接字符串方式可正常工作,为避免密钥轮换管理,升级至v4+预览版Azure扩展并改用托管系统身份(MSI)连接。目前Blob触发器可通过MSI正常触发执行,但调用context.done()保存数据至Cosmos DB时出现错误。
错误日志
2022-10-31T15:59:00.203 [Error] Executed 'Functions.SaveToCosmosDB' (Failed, Id=9162f53b-8c79-44bf-82b9-ca9c4267cc76, Duration=359ms) Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified
现有配置
host.json
{ "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview", "version": "[4.*, 5.0.0)" } }
function.json
{ "bindings": [ { "name": "imageBlob", "type": "blobTrigger", "direction": "in", "path": "images/{name}.bmp", "connection": "MYAPP_BLOB" }, { "direction": "out", "name": "metadata", "type": "cosmosDB", "databaseName": "MYAPP_COSMOS_DATABASE", "containerName": "MYAPP_COSMOS_CONTAINER", "connection": "MYAPP_COSMOS", "preferredLocations": "Central US" } ] }
解决方案及说明
修复配置项名称:v4扩展中,NodeJS等非.NET运行时的Cosmos DB绑定仍需使用
connectionStringSetting而非.NET版本的connection,这是正常设计并非文档笔误。请将function.json中Cosmos DB绑定的connection字段改为connectionStringSetting。解决.NET程序集缺失问题:
- 锁定扩展包版本:当前使用的
[4.*,5.0.0)范围可能包含存在依赖问题的版本,建议指定具体稳定预览版本,例如"[4.1.0,5.0.0)",避免自动升级到有bug的版本。 - 确认运行时版本:确保函数应用的
FUNCTIONS_EXTENSION_VERSION配置项设置为~4,与v4扩展匹配。 - 清理本地缓存(本地开发场景):删除项目根目录下的
.azurefunctions文件夹,重新启动函数,让系统重新下载完整的依赖包。 - 验证MSI配置:确保应用设置中
MYAPP_COSMOS的值是Cosmos DB账户的资源ID(格式:/subscriptions/{订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.DocumentDB/databaseAccounts/{账户名}),同时确认函数应用的托管身份已被授予Cosmos DB的Cosmos DB Built-in Data Contributor或更高权限。
- 锁定扩展包版本:当前使用的
关于配置项差异的说明:v4扩展中,.NET运行时将Cosmos DB绑定的
ConnectionStringSetting更名为Connection,但NodeJS等非.NET运行时并未同步修改,仍保留ConnectionStringSetting作为连接配置的键名,这是不同运行时的设计差异,不属于文档笔误。
内容的提问来源于stack exchange,提问作者Laurent Freyss
相关产品推荐
相关产品推荐

