下面给你 最清晰、最实用、最新的 .NET Core 自动检测并加载服务器专属环境变量方案,包含:

  • 通用解决策略(适用于 Linux / Windows / Docker / K8s)
  • 自动检测缺失环境变量
  • 自动加载环境变量(多环境、多服务器)
  • 完整 Program.cs 模板
  • 可扩展的“服务器特定配置文件方案”

你可以直接复制到你的项目中使用。


✅ 一、目标

当你的 .NET Core 项目部署到不同服务器时,要做到:

  • 在启动时 自动检测必须的环境变量是否存在
  • 根据服务器类型(如 nodeA、nodeB、prod、test)自动加载对应的环境变量
  • 开发环境和服务器环境自动区分
  • 避免把密码、连接字符串写死在 appsettings.json

✅ 二、最推荐的标准方法:环境变量 + appsettings.{ENV}.json 自动加载

.NET Core 内置机制会自动按顺序加载:

appsettings.json
appsettings.Development.json
appsettings.Production.json
环境变量
命令行参数

你可以用环境变量 ASPNETCORE_ENVIRONMENT 控制加载哪个配置:

Linux 设置环境:

export ASPNETCORE_ENVIRONMENT=Production

Windows 设置环境:

setx ASPNETCORE_ENVIRONMENT "Production"


✅ 三、自动检测环境变量是否缺失(强烈推荐)

Program.cs 增强代码

var builder = WebApplication.CreateBuilder(args);

// 加载环境变量
builder.Configuration.AddEnvironmentVariables();

// 定义你必须要读取的环境变量(可根据服务器不同调整)
string[] requiredKeys =
{
    "DB_CONNECTION",
    "REDIS_URL",
    "JWT_SECRET"
};

foreach (var key in requiredKeys)
{
    var value = builder.Configuration[key];
    if (string.IsNullOrWhiteSpace(value))
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine($"❌ 缺少必须的环境变量:{key}");
        Console.ResetColor();

        throw new Exception($"缺少必须的环境变量:{key}");
    }
}

var app = builder.Build();
app.Run();


✅ 四、根据“服务器名称”自动加载不同变量(最灵活)

假设你有多个服务器:

  • server-a (上海)
  • server-b (香港)
  • server-prod (生产)
  • server-test (测试)

你可以通过 SERVER_NAME 环境变量来让 .NET 自动识别并加载对应配置。


✨ 方案 A:基于 SERVER_NAME 自动加载 appsettings.SERVER_NAME.json

1)在服务器设置变量

Linux:

export SERVER_NAME=server-a

Windows:

setx SERVER_NAME "server-a"

2)Program.cs 中动态加载

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddEnvironmentVariables();

// 读取服务器名称
string serverName = builder.Configuration["SERVER_NAME"];

if (!string.IsNullOrEmpty(serverName))
{
    var fileName = $"appsettings.{serverName}.json";
    builder.Configuration.AddJsonFile(fileName, optional: true, reloadOnChange: true);

    Console.WriteLine($"🔧 已加载服务器特定配置文件:{fileName}");
}
else
{
    Console.WriteLine("⚠️ 未设置 SERVER_NAME 环境变量,使用默认配置文件");
}

var app = builder.Build();
app.Run();

3)创建对应文件,例如:

appsettings.server-a.json
appsettings.server-b.json
appsettings.server-prod.json


✅ 五、自动检测“当前服务器”并做出不同加载逻辑

你可以让程序自动读取服务器的 Hostname:

var hostname = System.Net.Dns.GetHostName();
Console.WriteLine("当前机器:" + hostname);

builder.Configuration.AddJsonFile($"appsettings.{hostname}.json", optional: true);

这样,只要创建:

appsettings.server-a.json
appsettings.server-b.json

系统就能自动加载对应服务器的配置文件。


✅ 六、Docker 环境下自动加载变量(最常用)

docker-compose.yml

environment:
  SERVER_NAME: "prod"
  DB_CONNECTION: "Server=db1;User=prod;Pwd=123"
  REDIS_URL: "redis://prod:6379"
  JWT_SECRET: "prod_secret"

程序启动会自动检测:

  • 必要变量是否缺失
  • 自动加载 appsettings.prod.json
  • 自动加载 appsettings.json
  • 自动加载环境变量

✅ 七、终极通用模板(适合生产环境)

这是你可以直接使用的完整版本:

Program.cs(可直接复制)

var builder = WebApplication.CreateBuilder(args);

// 1. 加载 appsettings.json + appsettings.EnvironmentName.json
builder.Configuration
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();

// 2. 基于 SERVER_NAME 加载服务器特定配置
var serverName = builder.Configuration["SERVER_NAME"];
if (!string.IsNullOrEmpty(serverName))
{
    var serverConfig = $"appsettings.{serverName}.json";
    builder.Configuration.AddJsonFile(serverConfig, optional: true);
    Console.WriteLine($"🔧 已加载服务器配置:{serverConfig}");
}

// 3. 自动检测关键环境变量(防止部署失败)
string[] requiredVars = new[]
{
    "DB_CONNECTION",
    "JWT_SECRET"
};

foreach (var key in requiredVars)
{
    if (string.IsNullOrWhiteSpace(builder.Configuration[key]))
        throw new Exception($"缺少必须的环境变量:{key}");
}

Console.WriteLine("所有关键环境变量加载成功!");

var app = builder.Build();
app.Run();


🎉 八、总结(适合 YouTube 或文章开头)

要做到 .NET Core 项目在不同服务器自动加载配置,你需要:
1️⃣ 自动读取环境变量
2️⃣ 自动检测缺失配置
3️⃣ 自动加载 appsettings.{Environment}.json
4️⃣ 根据 SERVER_NAME 动态加载服务器特定配置
5️⃣ 对 Docker 与 K8s 支持一键适配