You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:41:17