同一Windows服务器上的.NET应用如何按环境配置不同appSettings.json
问题背景
同一Windows服务器下部署UAT与生产环境(分属不同文件夹),现有appSettings.json和appsettings.development.json两类配置文件,需求为:
- UAT环境使用
appsettings.development.json - 生产环境使用
appSettings.json
当前采用Github Workflows实现CI/CD(有dev.yml和prod.yml两个工作流),应用通过IIS发布运行,无法在服务器上直接添加环境变量,且Startup.cs已配置默认的配置加载逻辑:
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
解决方案
以下三种方法均可实现需求,可根据实际场景选择:
方法1:发布时指定环境参数自动生成配置
利用dotnet publish的--environment参数,在发布UAT时指定环境为Development,发布后的web.config会自动添加ASPNETCORE_ENVIRONMENT环境变量,让应用加载对应的环境配置文件。
- 修改
dev.yml中的发布命令,添加--environment Development参数:- name: Release Dotnet application run: | stop-webapppool DevAPI stop-iissite -Name DevAPI -Confirm: $false dotnet publish DevAPI.App.Api -c Release --environment Development --output C:\backend\dev - 生产环境的
prod.yml中,发布命令无需添加该参数(或显式指定--environment Production),保持默认即可,此时应用会以Production环境启动,仅加载appsettings.json。
方法2:手动修改web.config添加环境变量
如果不想修改发布命令,可在UAT发布完成后,通过脚本修改web.config添加环境变量配置:
- 在
dev.yml的Release Dotnet application步骤末尾,添加PowerShell脚本修改web.config:- name: Release Dotnet application run: | stop-webapppool DevAPI stop-iissite -Name DevAPI -Confirm: $false dotnet publish DevAPI.App.Api -c Release --output C:\backend\dev # 添加环境变量到web.config $xml = [xml](Get-Content C:\backend\dev\web.config) $envVarsNode = $xml.CreateElement("environmentVariables") $envVarNode = $xml.CreateElement("environmentVariable") $envVarNode.SetAttribute("name", "ASPNETCORE_ENVIRONMENT") $envVarNode.SetAttribute("value", "Development") $envVarsNode.AppendChild($envVarNode) $xml.configuration.location.system.webServer.aspNetCore.AppendChild($envVarsNode) $xml.Save("C:\backend\dev\web.config") - 生产环境的
web.config保持默认,不添加该环境变量配置即可。
方法3:发布后重命名配置文件(直接替换)
如果不需要保留基础配置与环境配置的合并逻辑,可直接在UAT发布后将appsettings.development.json重命名为appsettings.json,覆盖原文件:
在dev.yml的Release Dotnet application步骤末尾添加:
- name: Release Dotnet application run: | stop-webapppool DevAPI stop-iissite -Name DevAPI -Confirm: $false dotnet publish DevAPI.App.Api -c Release --output C:\backend\dev # 替换配置文件 Copy-Item C:\backend\dev\appsettings.development.json C:\backend\dev\appsettings.json -Force
此方法简单直接,但会丢失appsettings.json中的基础配置,仅适合环境配置完全独立的场景。
内容的提问来源于stack exchange,提问作者Learn AspNet
相关产品推荐
相关产品推荐

