.NET Core 7发布版中appsettings.json二级配置值为空问题排查
.NET Core 6升级至7后Release模式下二级配置值为空问题排查
将项目从.NET Core 6升级到.NET Core 7后,Debug模式运行正常,但在Release模式下发现appsettings.json中的所有二级配置值均为空。以下是相关配置文件、实体类定义、Program.cs代码、配置验证逻辑及发布配置,请求排查.NET Core 6到7的变更导致该问题的原因。
1. appsettings.json配置
{ "appSettings": { "LogRetention": 90, "DefaultFileRetention": 90, "SFTP": { "Host": "SomeValue.Host.com", "Port": "22", "Username": "Some-User", "Passphrase": "", "FingerPrint": "ecdsa-sha2-nistp384 384 00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f", "PrivateKeyFilename": "Some-PrivateKey.ppk" } }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
2. AppSettings实体类定义
public class AppSettings { public int LogRetention { get; set; } = 0; // 日志文件保留天数 public int DefaultFileRetention { get; set; } = 0; // 客户端配置文件保留天数默认值 public SFTPSettings SFTP { get; set; } = new(); } public class SFTPSettings { public string Host { get; set; } = ""; public int Port { get; set; } = 22; public string Username { get; set; } = ""; public string Password { get; set; } = ""; public string Passphrase { get; set; } = ""; public string FingerPrint { get; set; } = ""; public string PrivateKeyFilename { get; set; } = ""; }
3. Program.cs中的Startup类代码
public class Startup { private readonly IServiceProvider provider; // 访问已构建的服务管道 public IServiceProvider Provider => provider; // 访问已构建的配置 public IConfiguration? Configuration { get; } public Startup() { var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables() .Build(); // 实例化服务 var services = new ServiceCollection(); // 配置日志 services.AddLogging(builder => { builder.AddConsole(); builder.AddDebug(); builder.AddNLog("nlog.config"); }); services.Configure<AppSettings>(configuration.GetSection("appSettings")); // 添加必要服务 services.AddSingleton<IConfiguration>(configuration); services.AddSingleton<AppSettings, AppSettings>(); services.AddScoped<Program, Program>(); // 构建服务管道 provider = services.BuildServiceProvider(); } }
4. 配置验证逻辑
private readonly IOptions<AppSettings> _appSettings; if (_appSettings.Value.LogRetention <= 0) Error += "appSettings.LogRetention 值必须大于0.<br />"; if (_appSettings.Value.DefaultFileRetention <= 0) Error += "appSettings.DefaultFileRetention 值必须大于0.<br />"; if (_appSettings.Value.SFTP.Host == "") Error += "appSettings.SFTP.Host 不能为空.<br />";
这段代码在.NET Core 6中(无论Debug还是Release模式)均未返回错误。但在.NET Core 7中,Debug模式正常,Release模式下_appSettings.Value.SFTP.Host为空。
5. 发布配置
Configuration = Release | Any CPU
Target Framework = net7.0
Deployment mode = Self-contained
Target runtime = win-x64
我无法找出问题所在,请问从.NET Core 6到.NET Core 7的哪些变更会导致无法正确获取appsettings配置值?
内容的提问来源于stack exchange,提问作者pdube
相关产品推荐
相关产品推荐

