如何为IIS托管的ASP.NET Core WebApp设置不被发布覆盖的持久配置
方案1:新增服务器专属高优先级本地配置文件(最稳妥,无冲突风险)
这是最推荐的方案,完全隔离开发/发布配置和服务器生产敏感配置:
- 修改程序的配置加载逻辑,在
Program.cs中新增一个可选的本地生产配置文件,优先级设为最高,会覆盖所有之前加载的配置:
// .NET 6+ 顶层语句写法示例 var builder = WebApplication.CreateBuilder(args); builder.Host.ConfigureAppConfiguration((context, config) => { // 加载服务器本地专属配置,可选不存在,修改自动重载 config.AddJsonFile("appsettings.Production.Local.json", optional: true, reloadOnChange: true); }); // 原有ConfigureServices的逻辑完全不需要修改
- 在项目
.csproj文件中添加配置,禁止该文件被发布到服务器:
<ItemGroup> <Content Update="appsettings.Production.Local.json" CopyToPublishDirectory="Never" /> </ItemGroup>
- 把该文件添加到
.gitignore中,避免被提交到代码仓库。 - 首次部署时让客户服务器管理员在站点根目录新建
appsettings.Production.Local.json,填入所有敏感配置即可,后续发布永远不会覆盖该文件。
方案2:使用IIS站点级环境变量(无需改代码,零侵入)
不需要修改任何代码,直接利用IIS站点级配置和ASP.NET Core默认配置优先级实现:
- 打开客户服务器的IIS管理器,找到对应站点,打开「配置编辑器」
- 节选择
system.webServer/aspNetCore,找到environmentVariables属性点击进入编辑 - 新增需要的配置项,例如键为
ConnectionString、值为生产环境连接字符串,保存即可
站点级环境变量仅对当前站点生效,不会和系统其他程序冲突,且WebDeploy发布不会修改IIS站点配置,永远不会被覆盖,原有配置读取代码无需任何改动。
方案3:修改发布规则排除指定配置文件(兼容现有逻辑,改动最小)
如果你不想调整代码,想继续用现有的配置文件(比如appsettings.Production.json、自定义secrets.json),只需要在发布配置中排除这些文件即可:
- 打开你WebDeploy对应的发布配置文件(后缀为.pubxml)
- 在
PropertyGroup节点下添加排除规则:
<ExcludeFilesFromDeployment>appsettings.Production.json;secrets.json</ExcludeFilesFromDeployment>
配置后发布时不会覆盖服务器上已经存在的对应文件,只需首次部署时让管理员填好敏感配置即可。
注:你之前自定义secrets.json无法读取是因为默认配置加载逻辑没有包含该文件,只需在配置加载代码中添加
config.AddJsonFile("secrets.json", optional: true, reloadOnChange: true)即可正常读取。
内容的提问来源于stack exchange,提问作者Linken
相关产品推荐
相关产品推荐

