Skip to content

环境变量与配置注入 ​

更新: 2026-10-16 15:20:09   字数: 0 字   时长: 0 分钟

当您在 AppHost 中用 WithReference 连接资源时,Aspire 会自动向消费方注入环境变量,这个过程称为配置注入。

理解这些命名约定,对以下场景尤为重要:

  • 用非 .NET 语言(Node.js、Python、Go…)编写的服务需要直接读取环境变量。
  • 排查「为什么连接字符串是空的」这类问题。

命名约定 ​

Aspire 会根据被引用资源的类型生成不同格式的环境变量。

连接字符串 ​

当引用的资源提供连接字符串(数据库、缓存、消息等)时,Aspire 会以资源名(或显式的 connectionName)作为逻辑连接名,原始的变量使用 ConnectionStrings__ 前缀:

text
ConnectionStrings__{资源名}
csharp
var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("my-cache");
var db = builder.AddPostgres("postgres").AddDatabase("my-db");

var api = builder.AddProject<Projects.Api>("api")
    .WithReference(cache)
    .WithReference(db);

builder.Build().Run();

对 api 资源而言,会得到:

原始环境变量可移植环境变量说明
ConnectionStrings__my-cacheConnectionStrings__my_cacheRedis 缓存的连接字符串。
ConnectionStrings__my-dbConnectionStrings__my_dbPostgreSQL 数据库连接串。

可移植连接名编码 ​

部分部署目标(Azure App Service、Kubernetes 系列发布器、Foundry Hosted Agents)不允许环境变量名中出现连字符,因此 Aspire 会额外生成一个可移植别名:

编码规则:

  • 保留大小写。
  • 把 ASCII 字母、数字、下划线之外的字符替换为 _。
  • 若以数字开头,在前面补一个 _。
  • 把连续下划线折叠为单个下划线。
逻辑连接名可移植环境变量
mydbConnectionStrings__mydb
my-dbConnectionStrings__my_db
my--dbConnectionStrings__my_db
my__dbConnectionStrings__my_db
MyDbConnectionStrings__MyDb
1dbConnectionStrings___1db

别名冲突会直接报错

别名冲突检查不区分大小写。如果两个引用映射到同一个物理名(例如逻辑名 my-db 与 my_db),Aspire 会在环境解析阶段报错,而不是静默覆盖。此时请为其中一个引用指定不同的 connectionName。

服务端点 ​

服务端点使用 services__ 前缀,格式为:

text
services__{服务名}__{端点名}__{索引}
环境变量含义
services__basket__https__0basket 的 https 端点。
services__basket__dashboard__0basket 的 dashboard 端点。

详见服务发现。

参数 ​

通过 AddParameter 创建、再经 WithEnvironment 传入的参数,使用您显式指定的变量名:

csharp
var insertionRows = builder.AddParameter("insertionRows");

builder.AddProject<Projects.Api>("api")
    .WithEnvironment("InsertionRows", insertionRows);

此时应用读取的是 InsertionRows,而不是 Parameters__insertionRows。

参数本身的值可以从配置读取,也可以在部署时由环境变量提供:

text
Parameters__registry_endpoint
Parameters__registry_repository

双下划线是 .NET 配置约定

配置路径中的冒号(:)在环境变量中写为双下划线(__)。因此 Parameters:registry-endpoint 对应环境变量 Parameters__registry_endpoint。

在应用中读取 ​

.NET ​

csharp
// 连接字符串
var conn = builder.Configuration.GetConnectionString("my-db");

// 普通配置
int rows = builder.Configuration.GetValue<int>("InsertionRows", 1);

连字符不会自动翻译

IConfiguration.GetConnectionString 不会自动把连字符翻译成下划线。对于 my-cache 这样的逻辑名:

  • 优先按逻辑名读取:GetConnectionString("my-cache")。
  • 若为 null,再回退到可移植键:GetConnectionString("my_cache")。
csharp
static string? GetPortableConnectionString(IConfiguration config, string logicalName)
{
    return config.GetConnectionString(logicalName)
        ?? config.GetConnectionString(logicalName.Replace('-', '_'));
}

其他语言 ​

typescript
// Node.js
const conn = process.env.ConnectionStrings__my_cache
python
# Python
import os
conn = os.getenv("ConnectionStrings__my_cache")

自定义物理变量名 ​

集成可以通过 IResourceWithConnectionString.ConnectionStringEnvironmentVariable 覆盖物理变量名。此时 Aspire 只发出这一个确切名称,不做任何规范化,connectionName 也不会重命名它。

迁移建议 ​

  • 更新 AppHost 包时同步更新客户端集成包:新版客户端会先按逻辑名查找,找不到再回退到可移植键。
  • 如果需要保留旧版客户端集成,请把引用的 connectionName 设为可移植名(如 my_db),并在应用的客户端注册或配置查询中使用同一名称。只改引用不改消费方是不够的。
  • 自定义发布器/集成请检查环境变量字典中的 ConnectionStringReference 值,而不是资源注解——EnvironmentVariableNames 属性才是权威来源。

下一步 ​

你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度