ASP.NET Core 6.0 Azure函数自定义类库无法加载appsettings.json
解决Azure函数类库加载appsettings.json失败的问题
核心问题原因
类库中使用AppContext.BaseDirectory获取的路径是Azure Functions CLI的运行目录(即错误提示中的C:\Users\HK2769561\AppData\Local\AzureFunctionsTools\Releases\4.35.0\cli_x64),而非你的函数项目输出目录,因此找不到appsettings.json。
推荐解决方案:依赖注入复用配置
不要在类库中单独构建配置实例,直接复用函数项目中已正确加载的配置,通过依赖注入传递:
- 在函数项目Startup.cs中注册配置到DI容器
修改Configure方法,构建完config后,将其注册为单例:
public override void Configure(IFunctionsHostBuilder builder) { var executionContextOptions = builder.Services.BuildServiceProvider() .GetService<IOptions<ExecutionContextOptions>>().Value; var currentDirectory = executionContextOptions.AppDirectory; var config= new ConfigurationBuilder() .SetBasePath(currentDirectory) // 直接用executionContextOptions.AppDirectory比Parent路径更可靠 .AddJsonFile("appsettings.json") .Build(); // 将配置注册到DI容器 builder.Services.AddSingleton<IConfiguration>(config); }
- 类库中通过构造函数注入IConfiguration
修改EngagementKeyVault的构造函数,接收注入的配置:
private readonly IConfiguration _configuration; public EngagementKeyVault(IConfiguration configuration) { _configuration = configuration; }
这样类库就能直接使用函数项目中正确加载的appsettings.json配置,完全避免路径问题。
备选方案:传递函数项目的根目录到类库
如果必须在类库中自行构建配置,需要将函数项目的正确根目录传递过去:
- 在函数项目调用类库时,把
executionContextOptions.AppDirectory作为参数传入类库的构造函数或方法 - 类库中使用该路径作为
SetBasePath的参数:
public EngagementKeyVault(string appRootDirectory) { _configuration = new ConfigurationBuilder() .SetBasePath(appRootDirectory) .AddJsonFile("appsettings.json") .Build(); }
这种方式不如依赖注入优雅,推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者Cust_1
相关产品推荐
相关产品推荐

