Mac版VS2017调试Azure Function读取local.settings.json返回空值求助
我之前在Mac上用VS2017调试Azure Functions时也碰到过一模一样的问题——用ConfigurationManager.ConnectionStrings["connName"].ConnectionString读配置总是返回空,但Windows上完全正常。后来才搞明白,这是Mac环境下VS2017对传统.NET配置方式的兼容问题,给你几个靠谱的解决步骤:
替换配置读取方式,用
Microsoft.Extensions.Configuration替代ConfigurationManagerConfigurationManager是.NET Framework时代的老方法,跨平台的Azure Functions环境(尤其是Mac上的VS2017)对它的支持并不完善。正确的姿势是用微软官方推荐的新配置体系:- 先安装NuGet包
Microsoft.Extensions.Configuration.Json - 修改你的配置读取代码:
using Microsoft.Extensions.Configuration; using System; // 在Function的方法里或者初始化逻辑中构建配置 var configBuilder = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); // 这一步很重要,Azure Functions会把配置转成环境变量 IConfiguration config = configBuilder.Build(); string connString = config.GetConnectionString("connName");
- 先安装NuGet包
检查local.settings.json的输出复制属性
在Mac的VS2017里,右键点击local.settings.json文件,确认它的“Copy to Output Directory”设置为“Copy if newer”。如果没设这个,调试时程序找不到配置文件,自然读不到值。排查环境变量冲突
Azure Functions本地调试时,会优先读取系统环境变量。如果你的Mac上正好设置了同名的环境变量(比如对应连接字符串的变量名可能是ConnectionStrings__connName),会覆盖local.settings.json里的配置。可以在终端里用echo $ConnectionStrings__connName检查一下,有冲突的话暂时删掉就行。
为啥Windows上能用ConfigurationManager?因为Windows版的VS Azure Functions工具链会额外做一层兼容,自动把local.settings.json里的连接字符串注入到ConfigurationManager的集合里,但Mac版没做这个兼容处理,所以必须用新的配置方式。
内容的提问来源于stack exchange,提问作者bbqchickenrobot

