.NET Core 应用程序中的 appsettings.json 与 appsettings.Environment.json

Posted

技术标签:

【中文标题】.NET Core 应用程序中的 appsettings.json 与 appsettings.Environment.json【英文标题】:appsettings.json vs appsettings.Environment.json in .NET Core apps.NET Core 应用程序中的 appsettings.json 与 appsettings.Environment.json 【发布时间】:2021-05-29 13:18:20 【问题描述】:

我是 .NET Core 的新手,从我在网络上的搜索中看到,appsettings.Development.json 用于开发应用程序时的开发配置,appsettings.Production.json 用于生产服务器中已发布的应用程序。这是我在两者上设置的示例部分:

appsettings.Development.json:

"ConnectionStrings": 
  "DefaultConnection": "Server=localhost,21433;Initial Catalog=DemoDbDev;User Id=demouser;Password=******;" 
,

appsettings.Production.json:

"ConnectionStrings": 
  "DefaultConnection": "Server=demo-prod-db,1433;Initial Catalog=DemoDbProd;User Id=demouser;Password=******;" 
,

这里有一些我需要澄清的问题:

1) appsettings.json 的用途是什么?它是用于默认配置还是用于不在appsettings.Development.jsonappsettings.Production.json 中的其他设置?

2) 环境是否设置在Properties 文件夹中的launchSettings.json 上?如果是这样,我们是否应该在将应用发布到生产服务器之前手动更新此文件?

3) 在开发和发布我的应用程序(到 IIS 服务器或 Docker 容器)时,关于开发和生产环境配置有什么需要注意的吗?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

1。关于环境

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-5.0

TLDR;您可以从环境变量或启动设置文件中获取环境。后者仅用于本地开发。

为了确定运行时环境,ASP.NET Core 从以下环境变量中读取:

DOTNET_ENVIRONMENT 调用 ConfigureWebHostDefaults 时的 ASPNETCORE_ENVIRONMENT。默认的 ASP.NET Core Web 应用模板调用 ConfigureWebHostDefaults。 ASPNETCORE_ENVIRONMENT 值覆盖 DOTNET_ENVIRONMENT。 IHostEnvironment.EnvironmentName 可以设置为任何值,但以下值由框架提供:

Development:launchSettings.json 文件在本地机器上将 ASPNETCORE_ENVIRONMENT 设置为 Development

分期

Production :如果 DOTNET_ENVIRONMENT 和 ASPNETCORE_ENVIRONMENT 尚未设置,则为默认值。

2。设置已满

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0

TLDR;如您所述,您在普通 json 中设置默认值和不变值,并在环境 json 中设置覆盖。

默认的 JsonConfigurationProvider 按以下顺序加载配置:

    appsettings.json appsettings.Environment.json :例如 appsettings.Production.json 和 appsettings.Development.json 文件。

根据 IHostingEnvironment.EnvironmentName 加载文件的环境版本。

appsettings.Environment.json 值覆盖 appsettings.json 中的键。

3。记住

不应将生产环境的秘密和密码存储在配置文件中。

考虑在 Azure 或数据库加密配置上使用密钥库等服务,或构建将覆盖环境特定机密的服务器变量。

【讨论】:

1.没有,你应该定义它 关于2.和3.可以使用ntlm认证。 ***.com/questions/46295932/ntlm-sql-connection-string 用于 sql 服务器。根据环境和数据库风格,解决方案可能会有所不同。 这里关于第一个问题的例子:***.com/questions/41546943/… DOTNET_ENVIRONMENT 取代了 Aspnet 版本,可在 Web 和非 Web(控制台)方案中使用。虽然 asp 版本仅适用于 web 应用程序,但我建议在任何地方使用其他版本进行标准化 使用 azure keyvault、azure app 配置或其他一些机密/配置管理系统。请注意,dotnet 有几个内置的配置提供程序(例如 json 文件),并且有许多通过 nuget 包提供的插件提供程序(azure keyvault、hashicorp vault、平面文件、ini、从 API 检索的自定义设置等)。配置系统将按照添加提供者的顺序对它们进行分层(最后覆盖优先)。因此,您可以在 app.settings 中进行一些基本配置,在每个 env json 中进行 env 覆盖,然后将来自其他地方的秘密合并为一个配置对象

以上是关于.NET Core 应用程序中的 appsettings.json 与 appsettings.Environment.json的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 中的静态文件

Ninject 中的 .NET Core DI 范围生命周期

ASP.Net-Core 中的自定义身份验证

从 ASP.NET Core Blazor 中的 .NET 方法调用 JavaScript 函数

ASP MVC 应用程序中的列加密与使用 .net Core / EF Core 的 SQL Server 2016

.NET Core DI 中的异步提供程序