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

.NET 8 WebAPI无法通过ConfigurationManager读取appsettings.json连接字符串

.NET 8 WebAPI中DbContext读取appsettings.json连接字符串报“对象未实例化”的问题解决

问题描述

基于.NET 8的ASP.NET WebAPI项目中,DbContext硬编码连接字符串时可正常运行:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("server=.;database=myDb;trusted_connection=true;");
}

但将连接字符串存入入口项目MainAPI的appsettings.json后,在Data.Persistence类库的DbContext中使用ConfigurationManager读取时,报错“对象未实例化”:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["Yoman"].ConnectionString);
}

appsettings.json配置内容:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "Yoman": "server=xxxx;database=Tester;integrated security=true;multipleactiveresultsets=true;"
  }
}

原因分析

  • ConfigurationManager适配问题:ConfigurationManager是传统.NET Framework的配置读取方式,在.NET Core/.NET 8环境下,默认不会自动加载appsettings.json这类配置文件,直接调用会返回null,访问ConnectionString属性时触发空引用异常。
  • 类库权限限制:Data.Persistence作为类库项目,本身不会自动加载入口项目MainAPI的appsettings.json配置文件,无法直接读取其中的内容。
  • 不符合ASP.NET Core设计理念:.NET 8 WebAPI的配置体系依赖依赖注入(DI),而非直接通过静态类读取配置。

解决方案

方式一:在启动项目中注入DbContext(推荐)

这是符合ASP.NET Core设计规范的做法,将配置管理集中在启动项目,类库通过DI获取配置:

  1. 在MainAPI项目的Program.cs中读取连接字符串并注册DbContext:
var builder = WebApplication.CreateBuilder(args);

// 从appsettings.json读取指定连接字符串
var connectionString = builder.Configuration.GetConnectionString("Yoman");

// 注册DbContext到DI容器,传入连接字符串
builder.Services.AddDbContext<YourDbContext>(options =>
    options.UseSqlServer(connectionString));

// 其他中间件配置...
var app = builder.Build();
  1. 修改Data.Persistence项目中的DbContext,移除ConfigurationManager相关代码,仅保留未配置时的默认逻辑(可选):
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    // 仅当外部未配置DbContext时,使用本地硬编码的连接字符串(用于单独测试类库)
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlServer("server=.;database=myDb;trusted_connection=true;");
    }
}

方式二:手动在类库中加载配置(不推荐)

如果必须在DbContext中直接读取配置,可手动加载appsettings.json,但会增加类库与启动项目的耦合度:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    // 构建配置对象,指定入口项目的appsettings.json路径
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .Build();
    var connectionString = config.GetConnectionString("Yoman");
    optionsBuilder.UseSqlServer(connectionString);
}

注意:部署时需确保appsettings.json路径正确,否则会加载失败。

总结

推荐使用方式一,通过DI注入DbContext并传入连接字符串,既符合ASP.NET Core的分层架构设计,也便于后续扩展配置源(如环境变量、密钥管理服务等),无需修改类库代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:13:10