如何在ASP.NET Core中转换AppSettings

8

我曾经认为appsettings.json及其环境副本(dev、staging、production)可以取代Web.config转换。

在开发环境中,这很好用,因为这些环境的变量存在于launchSettings.json中。

然而,如果我使用发布功能,并配置发布使用我创建的Staging构建配置,则不会出现任何转换。

我在其他地方读到需要创建环境变量。真的吗!难道我们现在有了一大堆系统环境变量,供应用程序使用,这些应用程序可能(或可能不会)在该框上运行的IIS(或其他)Web服务器上运行。

目前,我正在手动复制并粘贴“staging”appsettings.json,然后进行发布。我已经不得不将预先准备好的Web.config文件复制并粘贴到该文件夹中,因为它在IDE中不再可用(但奇怪的是,在发布操作期间仍然会生成)。

还有没有其他方法来实现可维护的部署转换,类似于旧配置文件的转换方式?


2
你不需要再这样做了。现在使用不同的设置要容易得多。你可以从多个来源加载配置。添加新的配置会覆盖旧的设置。不必再为暂存或生产环境转换 web.config,你可以先加载 appsettings.json,然后再加载 appsettings.staging.json 来覆盖生产环境的设置。staging 值可以轻松地来自环境变量或命令行,或者你可以简单地不包括额外的设置文件。 - Panagiotis Kanavos
4
此已在文件本身中描述 - ASP.NET Core 中的配置。这比任何 Stack Overflow 问题或随机论坛讨论都要清晰得多,并表明您不需要创建任何环境变量。使用一个众所周知的环境变量作为源,只是检测环境的一种方式。您可以选择任何方法。唯一重要的是您注册提供程序的顺序。 - Panagiotis Kanavos
1
最后,这适用于任何.NET Core应用程序,而不仅仅是ASP.NET Core。请查看Essential .NET: Configuration,其中解释了控制台应用程序如何使用相同的功能。 WebHostBuilder只是提供了一些合理的初始注册。 - Panagiotis Kanavos
2
@PanagiotisKanavos 我认为OP关于环境变量的评论是一个相当合理的观点。当然,Docker信徒可以利用它们。但是随着应用程序在系统中出现和消失,您可能会最终得到一堆杂乱无章的系统环境变量。对我来说,这似乎是一种维护负担。使用Web.config设置它们是我的首选方式。但同样地,您必须在IDE之外进行设置。从维护的角度来看,我认为这是退步。但我不是开发运维人员,他们可能已经习惯了这种方式。 - DavidRogersDev
2
@onefootswill 这并不是一个坏问题。一点点的挫败感并不会使它成为一个坏问题。我已经向SO反馈过这种情况,但他们已经证明不听取用户的建议。这就是为什么我通常更喜欢MSDN论坛。 - DavidRogersDev
显示剩余7条评论
2个回答

5
实际上,这让许多人感到困惑,因为在Visual Studio中的配置对ASP.NET Core应用程序并没有实际作用。ASP.NET Core应用程序旨在为任何环境编译一次。它运行的实际“环境”是通过配置确定的,即ASPNETCORE_ENVIRONMENT环境变量。换句话说,无论您在Visual Studio中部署为Debug / Staging / Release / Whatever,它都是相同的应用程序代码。(唯一不是这种情况的时候是,如果您在代码中使用编译器指令,例如#if DEBUG ... #endif。那不是很常见,而且也不建议使用。)
我认为你对环境变量有误解。您仍然可以在生产中使用JSON配置等内容。唯一需要设置的环境变量是前面提到的ASPNETCORE_ENVIRONMENT
长话短说,如果将ASPNETCORE_ENVIRONMENT设置为“Production”,则会像预期的那样加载appsettings.Production.json。没有发生任何转换。相反,特定于环境的配置用于扩展和覆盖其他配置。

5
我也觉得这很烦人。我喜欢能够更改我的解决方案配置并使用生产或暂存配置值进行测试(本地)。
无论如何,这里有一个较低的摩擦选项。可能还有更好的选择。
  1. 将所有生产设置放在appsettings.json中。最坏的情况是某些东西使用了您的生产服务的所有安全级别,这比意外给予开发访问权限要好。这意味着您的生产环境变量上不需要有任何内容,因此也没有什么可以意外删除的。
  2. 创建一个appsettings.Development.json文件并添加您的开发数据库连接字符串等内容。您只需要加入与不同的项目,无需转换,它们将覆盖 appsettings.json 中匹配到的任何内容。
  3. lauchsettings.json应该已经设置了一个profiles > {name} > environmentVariables > ASPNETCORE_ENVIRONMENT的值为Development。您可以将其注释掉,然后使用生产设置进行测试。
如果您想添加一个暂存级别,请添加一个新的配置文件appsettings.staging.json。您需要添加环境变量,但这通常不是问题和风险,也比在生产环境中更少。但我还没有想到一种在同一台机器上使用暂存和开发环境的简单方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接