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

.NET 6中ApplicationSettings属性返回null问题求助

.NET 6中ApplicationSettings读取配置返回null的问题

问题描述

在.NET 6项目中读取ApplicationSettings配置时,该对象返回null,导致后续访问其属性时触发空引用异常,无法正确获取配置值。

关键代码片段

读取配置的核心代码:

var appSettings = _config.GetSection(nameof(ApplicationSettings)).Get<ApplicationSettings>();

完整Program.cs代码

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.ResponseCompression;
using ServiceCollection = Microsoft.Extensions.DependencyInjection.ServiceCollection;
using ZbirkaNaKrvodariteli;
using ZbirkaNaKrvodariteli.Services;
using ZbirkaNaKrvodariteli.Core.Logging.Injection;
using ZbirkaNaKrvodariteli.Core.Utils.ApplicationVersion.Injection;
using ZbirkaNaKrvodariteli.Services.Injection;

var builder = WebApplication.CreateBuilder(args);
var _config = builder.Configuration;
var serviceCollection = new ServiceCollection();
serviceCollection.AddKrvodariteliLogging();
var serviceProvider = serviceCollection.BuildServiceProvider();
var _logger = serviceProvider.GetService<ZbirkaNaKrvodariteli.Core.Logging.ILogger>();

var appSettings = _config.GetSection(nameof(ApplicationSettings)).Get<ApplicationSettings>();
DbUpgrade db = new DbUpgrade(_logger, _config, appSettings.GeneralSettings.DatabaseBackupLocation);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddRouting();
builder.Services.AddResponseCompression(options =>
{
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});
builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});
//builder.Services.AddAntiforgery(a => a.HeaderName = "XSRF-TOKEN");
builder.Services.AddAntiforgery(options =>
{
    // Set Cookie properties using CookieBuilder properties†.
    options.FormFieldName = "AntiforgeryFieldname";
    options.HeaderName = "X-CSRF-TOKEN-HEADERNAME";
    options.SuppressXFrameOptionsHeader = false;
});
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
                    options =>
                    {
                        options.ExpireTimeSpan = TimeSpan.FromMinutes(appSettings.SecuritySettings.SessionExpirationTime);
                        options.SlidingExpiration = true;
                        options.LoginPath = new PathString(string.Format("/account/login"));
                        options.AccessDeniedPath = new PathString(string.Format("/account/denied"));
                        options.LogoutPath = new PathString(string.Format("/Account/LogOff"));
                    });
builder.Services.AddMemoryCache();
builder.Services.AddSingleton<ApplicationSettings>();
builder.Services.AddUnitOfWorkFactories();
builder.Services.AddDbContexts();
builder.Services.AddApplicationServices();
builder.Services.AddReportsServices();
builder.Services.AddKrvodariteliLogging();
builder.Services.AddApplicationVersioning();
builder.Services.AddHttpContextAccessor();
builder.Services.AddDistributedMemoryCache();
//var conString = builder.Configuration.GetConnectionString("AlkRepDB");
//CustomerManagementConfigure.Configure(builder.Services, conString);
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseResponseCompression();
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto
});

app.UseJwtTokenMiddleware();
app.UseHttpsRedirection();
app.UseCookiePolicy();
app.UseStaticFiles();
app.UseAuthentication();

app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

appsettings.json配置(敏感信息已隐藏)

{
  "LoggingConfiguration": {
    "FileLoggingConfiguration": {
      "LogFileName": "...",
      "LogFileSize": 10
    }
  },
  "ConnectionStrings": {
    "Krvodaritelstvo": "..."
  },
  "ApplicationSettings": {
    "SecuritySettings": {
      "LockoutTimeInMunutes": 5,
      "NumberOfFailedTriesForLockout": 3,
      "PasswordExpirationInDays": 70,
      "ResetPasswordTokenExperationMinutes": 15,
      "SessionExpirationTime": 20
    },
    "ReportLoggingSettings": {
      "ResultZipPassword": "..."
    },
    "GeneralSettings": {
      "LandingPage": "",
      "DatabaseBackupLocation": "..."
    }
  }
}

ApplicationSettings类定义

namespace ZbirkaNaKrvodariteli
{
    public class ApplicationSettings
    {
        public SecuritySettings SecuritySettings { get; set; }
        public ReportLoggingSettings ReportLoggingSettings { get; set; }
        public GeneralSettings GeneralSettings { get; set; }
    }
    public class SecuritySettings
    {
        public int LockoutTimeInMunutes { get; set; } = 5;
        public int NumberOfFailedTriesForLockout { get; set; } = 3;
        public int PasswordExpirationInDays { get; set; } = 70;
        public int ResetPasswordTokenExperationMinutes { get; set; }
        public int SessionExpirationTime { get; set; } = 20;
    }
    public class ReportLoggingSettings
    {
        public string ResultZipPassword { get; set; }
    }
    public class GeneralSettings
    {
        public string LandingPage { get; set; }
        public string DatabaseBackupLocation { get; set; }
    }
}

报错信息

对象引用未设置到对象的实例。
在 Program.

$(String[] args) 位置 ...\Program.cs:行号 17

排查与解决建议

  • 检查配置文件复制属性:确保appsettings.json的"复制到输出目录"属性设置为"始终复制"或"如果较新则复制",避免运行时找不到配置文件。
  • 验证配置节名称:可尝试直接使用字符串"ApplicationSettings"代替nameof(ApplicationSettings),排除命名空间或类名歧义导致的节名称不匹配。
  • 添加配置绑定验证:在读取配置后增加空值检查,提前抛出明确异常:
    var appSettings = _config.GetSection("ApplicationSettings").Get<ApplicationSettings>();
    if (appSettings == null)
    {
        throw new InvalidOperationException("无法读取ApplicationSettings配置");
    }
    
  • 确认配置加载逻辑:检查builder.Configuration是否正确加载了appsettings.json,若有自定义配置源,需确保未覆盖或遗漏该文件。
  • 修正服务注册方式:将builder.Services.AddSingleton<ApplicationSettings>()替换为注册已绑定好的实例,避免注入空对象:
    builder.Services.AddSingleton(appSettings);
    
  • 核对嵌套类属性匹配:确保所有嵌套类的属性名称与json中的键完全一致(大小写敏感),比如LockoutTimeInMunutes的拼写需保持统一。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:31:22