Skip to content

ASP.NET Core 6+ 中访问配置的完整指南

版本说明

本文内容适用于 .NET 6、.NET 7 和 .NET 8 版本

问题概述

在 ASP.NET Core 6 之前的版本中,开发人员通过 Startup.cs 类来配置应用程序,可以轻松注入 IConfigurationIHostEnvironment 等对象。但在 .NET 6 及更高版本中,Microsoft 引入了简化后的模板,移除了 Startup.cs 文件,将配置和中间件设置都集中在 Program.cs 中。

很多开发者因此不知道如何在新的模板中访问配置信息,特别是在需要读取 appsettings.json 文件或环境变量时。

解决方案

1. 使用 WebApplicationBuilder 访问配置

WebApplication.CreateBuilder(args) 返回的 WebApplicationBuilder 对象提供了直接访问配置和环境信息的方式:

cs
var builder = WebApplication.CreateBuilder(args);

// 访问配置对象
ConfigurationManager configuration = builder.Configuration;

// 访问环境信息
IWebHostEnvironment environment = builder.Environment;

// 使用配置信息
builder.Services.AddDbContext<FestifyContext>(opt =>
    opt.UseSqlServer(builder.Configuration.GetConnectionString("Festify")));

2. 使用 WebApplication 访问配置

构建应用后,也可以通过 WebApplication 实例访问配置:

cs
var app = builder.Build();

// 构建后访问配置
IConfiguration configuration = app.Configuration;
IWebHostEnvironment environment = app.Environment;

3. 配置特定设置类

对于复杂的配置结构,推荐使用强类型配置类:

cs
// appsettings.json
{
  "ConnectionStrings": {
    "Festify": "YourConnectionString"
  },
  "AppSettings": {
    "Token": "your-token-value"
  }
}
cs
// 配置类
public class AppSettings
{
    public string Token { get; set; }
}

// Program.cs 中注册配置
builder.Services.Configure<AppSettings>(
    builder.Configuration.GetSection("AppSettings"));

// 在控制器或服务中注入使用
public class MyService
{
    private readonly AppSettings _appSettings;
    
    public MyService(IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings.Value;
    }
    
    public void UseToken()
    {
        var token = _appSettings.Token;
        // 使用 token
    }
}

4. 访问连接字符串

cs
// 直接访问连接字符串
string connectionString = builder.Configuration.GetConnectionString("Festify");

// 在 DbContext 中使用
builder.Services.AddDbContext<FestifyContext>(options =>
    options.UseSqlServer(connectionString));

5. 多环境配置

cs
// 根据不同环境加载不同的配置文件
var builder = WebApplication.CreateBuilder(args);

// 自动加载 appsettings.json 和 appsettings.{Environment}.json
// 环境变量优先级最高
json
{
  "ConnectionStrings": {
    "Festify": "Server=localhost;Database=DevDB;Trusted_Connection=true;"
  }
}
json
{
  "ConnectionStrings": {
    "Festify": "Server=prod-server;Database=ProdDB;User Id=user;Password=pass;"
  }
}

6. Worker Service 的特殊情况

对于 Worker Service(非 Web 应用),配置访问方式略有不同:

cs
IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
        // 通过 context.Configuration 访问配置
        var settings = context.Configuration.GetSection("AppSettings").Get<AppSettings>();
    })
    .Build();

最佳实践

  1. 使用强类型配置:创建配置类并使用 GetSection()Get<T>() 方法
  2. 遵循环境约定:利用 appsettings.{Environment}.json 文件管理不同环境的配置
  3. 安全存储敏感信息:使用用户机密(开发时)或 Azure Key Vault/AWS Secrets Manager(生产环境)
  4. 避免硬编码配置路径:使用配置系统而不是直接访问特定文件

常见问题

注意事项

  • 确保配置键名与 JSON 文件中的路径完全匹配(区分大小写)
  • 环境特定的配置文件会自动基于 IHostEnvironment.EnvironmentName 加载
  • 环境变量的优先级高于配置文件中的设置

总结

在 ASP.NET Core 6+ 中,通过 WebApplicationBuilder.Configuration 属性可以轻松访问配置信息。新的编程模型虽然移除了 Startup.cs,但提供了更简洁直观的方式来配置应用程序和服务。

cs
var builder = WebApplication.CreateBuilder(args);

// 访问配置和环境信息
var configuration = builder.Configuration;
var environment = builder.Environment;

// 使用配置注册服务
builder.Services.AddDbContext<FestifyContext>(options =>
    options.UseSqlServer(configuration.GetConnectionString("Festify")));

var app = builder.Build();
// 应用配置和中间件
app.Run();

这种新的模式减少了模板代码,使应用程序的启动配置更加简洁和直观。