我目前正在从.NET Framework切换到.NET Core。过去,我的所有应用程序设置都在Web.config文件中。当我添加新的发布配置文件时,我可以右键单击并选择“添加配置转换”,这将生成Web.config下的嵌套Web。{Profile} .config文件,我可以在其中设置特定于相应配置文件的应用程序设置。
现在,在.NET Core中,我希望使用appsettings.json文件而不是Web.config文件来实现相同的效果。如何创建appsettings。{Profile} .json文件,它将嵌套在我的appsettings.json文件下并包含特定于我的发布配置文件的设置?当然,我可以手动创建文件,但是什么是“链接”设置,以便在应用程序发布时它们将覆盖appsettings.json?有没有一种简单的方法在Visual Studio中执行此操作,就像我为旧的.NET Framework项目所描述的那样?或者我错过了什么?
谢谢!
但是什么是“链接”设置,以便在应用程序发布时它们将覆盖appsettings.json?
appsettings由WebHost
在Program.cs
配置
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
在webhost.cs的实现中,框架将appsettings添加到webhost:
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
第二行是添加特定环境appsettings
的地方。在Visual Studio中,此环境变量在Project Settings -> Debug
页面中定义,称为ASPNETCORE_ENVIRONMENT
。默认情况下,它设置为Development
,因此当您在Visual Studio中构建并运行时,appsettings.development.json
文件(如果存在)将被加载并覆盖appsettings.json
文件中的任何匹配设置。
发布应用程序时,可以使用同名的OS环境变量覆盖此值。 .NET Core从中读取值的层次结构具有“最后一个赢”策略。
层次结构目前是:
- 文件(appsettings.json,appsettings。{Environment} .json,其中{Environment}是应用程序的当前托管环境)
- Azure Key Vault
- 用户机密(秘密管理员)(仅限开发环境)
- 环境变量
- 命令行参数
因此,在发布应用程序时,您可以使用环境变量覆盖主机操作系统上的环境。当.NET Core启动您发布的应用程序时,它将读取该变量并加载相应的appsettings。{environment} .json文件。如果未设置该值,或者该环境不存在任何文件,则appsettings.json
中的设置将适用。
你可以阅读更多关于ASPNETCORE_ENVIROMENT
设置here的信息
...从我最初的评论开始,我发现VS 2017和MS Build for .NET Core完全支持web.config转换,一旦你意识到嵌套和转换构建命令不需要成为该项目不再。不要再使用web.config上的“添加配置转换”命令,除非您找到不损坏项目文件的修复程序。只需手动添加web.config的转换版本,它们就会自动嵌套并在发布时运行。是的VS 2017!
您的web.Release.config中的以下内容非常适合设置您的环境变量。
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<location>
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" xdt:Locator="Match(name)" xdt:Transform="SetAttributes" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
</configuration>
此外,使用.NET Core 2.2,您不再需要将其他appsettings转换(关闭环境变量)添加到Startup类。这默认......
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
...自动处理接受的答案代码。
最重要的是,作为一个毫无歉意的微软开发人员,我仍然想要假设我的应用程序只会使用MS Build和Web Deploy发布到IIS服务器,我希望能够通过应用程序自己的配置来配置我的应用程序;我希望能够在Build上执行此操作,而不是作为发布或发布后命令行命令。如果微软或某人为Visual Studio创建了一个简单的构建插件,它将转换我的appsettings.json文件,所以我只发布给定环境所需的内容,我很乐意使用它,但是我没有找到它,或者有是时候写一个了。
所以我确保直接回答OP的问题:AppSettings可以很容易地从web.config转移到appsettings.json,并且可能应该,只要您了解所有appsettings.json文件已发布,并在运行时确定-time,与真正的转换解决方案不同,根据请求的配置文件,只发布必要的文件和设置。仅使用web.config转换来设置必要的环境变量,以确定要使用哪个appsettings。{env} .json文件。同样,如果我们可以将我们的apsettings.json文件转换为我们的web.config,就像OP请求的那样,整个讨论就像Dodo一样。我觉得有一天它会来,如果它还没有。
是的,从旧版.NET Framework迁移到.NET Core可能是一项有趣的练习。 .NET Core是向前迈出的一大步,但是有一些障碍可以克服;特别是那些从一开始就留下遗产的人。