C# ADLS2 Blob触发函数使用托管身份报InvalidHeaderValue错误
问题根因
从错误日志里的Server: Azurite-Blob/3.16.0可以直接判断,运行时根本没有发起对目标线上ADLS2存储账户的请求,所有存储请求都被路由到了本地的Azurite存储模拟器,具体触发原因有三个:
- 你的
local.settings.json中写了//Blob trigger格式的单行注释,标准JSON不支持单行注释语法,会导致Functions本地运行时加载配置时解析失败,后面的MyConnection相关配置项完全没有被读取到。当运行时找不到BlobTrigger特性指定的MyConnection连接配置时,会自动回退使用AzureWebJobsStorage配置的本地模拟器连接。 - 你本地安装的Azurite版本为3.16.0,该版本和支持身份鉴权的新版Azure Storage SDK存在兼容性问题,无法识别SDK请求中携带的部分鉴权相关HTTP头,直接返回
InvalidHeaderValue的400错误。 - 如果你的项目引用的
Microsoft.Azure.WebJobs.Extensions.Storage包版本低于5.0.0,就算配置文件格式正确,老版本扩展也不支持基于托管身份的无密钥连接格式,会直接忽略带__blobServiceUri、__queueServiceUri后缀的配置项,同样会回退到AzureWebJobsStorage的模拟器连接。
注意:Visual Studio服务依赖面板的连接状态检测是独立于Functions运行时加载逻辑实现的,不会校验配置文件语法、扩展版本兼容性,因此显示连接正常不代表运行时能正确加载连接配置。
修复步骤
- 修正
local.settings.json配置,删除所有注释内容,保证JSON格式合法,修正后的配置参考:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "MyConnection__blobServiceUri": "https://mystorageaccount.blob.core.windows.net", "MyConnection__queueServiceUri": "https://mystorageaccount.queue.core.windows.net" } }
- 升级本地Azurite模拟器到3.20.0以上最新稳定版,修复旧版本对新版SDK请求头的兼容问题,升级完成后重启Azurite服务。
- 检查项目Nuget引用,将
Microsoft.Azure.WebJobs.Extensions.Storage升级到5.0.0以上稳定版本,低于该版本的扩展完全不支持无密钥的身份鉴权连接方式。 - 额外校验本地登录Azure账号的权限,除了Blob数据的读写权限外,还需要给账号分配目标存储账户的存储队列数据参与者角色——Blob触发器底层依赖存储队列接收Blob变更通知,没有队列权限会导致触发器初始化失败。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

