如何防止ASP.NET Core 2.0应用Web部署时web.config被覆盖?
解决Web部署自动覆盖web.config并配置不同服务器环境变量的方案
我完全懂你的痛点——Web部署自动生成的web.config总是把自定义配置冲掉,还要给不同服务器设不同环境变量,还不想把web.config放进项目里。下面是几个实用的方案,你可以根据自己的情况选:
1. 利用Web部署的参数化配置(推荐)
Web Deploy本身支持参数化替换,这样你不用在项目里放web.config,而是在部署时动态设置环境变量,还能避免覆盖。
- 步骤1:在项目里创建一个
web.config.template文件(这个可以纳入项目管理),里面把需要动态替换的环境变量用占位符标记,比如:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="#{ASPNETCORE_ENVIRONMENT}#" /> </environmentVariables> </aspNetCore> - 步骤2:创建一个
parameters.xml文件放在项目根目录,定义参数和替换规则:<parameters> <parameter name="ASPNETCORE_ENVIRONMENT" description="环境变量值" defaultValue="Production"> <parameterEntry kind="XmlFile" scope="\\web.config$" match="/configuration/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" /> </parameter> </parameters> - 步骤3:部署时,在Visual Studio的发布配置里,找到“参数”选项卡,就可以为不同服务器设置不同的
ASPNETCORE_ENVIRONMENT值了。而且因为项目里没有web.config,部署时会自动用模板生成,再替换参数,不会出现覆盖问题。
2. 服务器端保留自定义web.config,跳过部署时的覆盖
如果已经在服务器上有了自定义的web.config,不想每次部署都被覆盖,可以修改Web Deploy的设置:
- 在Visual Studio的发布配置中,切换到“文件发布选项”,勾选“在目标处保留额外的文件”,这样部署时不会删除或覆盖服务器上已存在的web.config(前提是项目里没有包含web.config,否则还是会被替换)。
- 另外,也可以在
pubxml发布配置文件里添加如下配置,明确排除web.config的部署:
这样即使项目里不小心有web.config,部署时也不会上传到服务器,服务器上的自定义版本就会保留。<ItemGroup> <ExcludeFilesFromDeployment Include="web.config" /> </ItemGroup>
3. 使用环境特定的配置文件(结合服务器本地配置)
ASP.NET Core支持环境特定的配置,你可以在服务器上放置本地的配置文件,让应用自动加载:
- 在项目里创建
appsettings.{Environment}.json文件,比如appsettings.Staging.json、appsettings.Production.json,这些可以纳入项目,但环境变量的最终值可以在服务器上的web.config里设置,或者用服务器的环境变量(IIS里可以在应用程序池的高级设置里添加环境变量)。 - 如果不想用web.config,还可以在服务器上设置系统级或应用池级的环境变量:打开IIS管理器,找到你的应用程序池,右键“高级设置”,在“环境变量”里添加
ASPNETCORE_ENVIRONMENT和对应的值。这样应用启动时会自动读取这个环境变量,加载对应的配置文件,完全不需要修改web.config。
注意事项
- 确保项目里的
.gitignore(如果用Git)包含web.config,避免不小心提交到版本库。 - 如果用参数化配置,记得在不同的发布配置文件(比如
Staging.pubxml、Production.pubxml)里设置不同的参数值,这样一键发布到不同服务器时会自动使用对应的值。
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

