.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
相关产品推荐
相关产品推荐

