首页 > 解决方案 > 我可以使用不同的 appsettings.xxx.json 文件和调试配置文件设置多个开发环境吗?

问题描述

我已经阅读了一些关于为部署 ASP.Net Core 应用程序设置环境的文档。这些文章通常引用Development按名称暂存生产,但从不偏离这些传统的环境名称。

通常,一旦您退出“开发”,您希望关闭开发/调试设置,以便在您的应用程序崩溃时敏感信息不会泄露到网络上。这是有道理的。

但是,我的应用程序处于开发的早期阶段,我需要两个可以调试的开发环境配置。具体来说,我的团队主要希望在本地开发,连接到本地 SQL Server 数据库。但是,我们需要设置和测试 Azure 数据库,对于初步设置,如果我们可以在本地运行服务器开发模式,并且能够从我们的开发盒连接到我们的 Azure 数据库,这将有所帮助。

我想做的是创建两个名为aspsettings.Development.jsonand的配置文件aspsettings.LocalDevelopment.json,这两个文件都在我的解决方案中的两个 ASP.Net 核心项目中——一个用于 Web API,另一个用于 UI 项目。

Development将包含用于连接到适当的开发数据库服务器(用于开发测试的 Azure 数据库需要访问 Azure)的所有值,并且LocalDevelopment环境将用于连接到本地数据库。

我已将这些文件添加到我的项目中,将Development详细信息复制到LocalDevelopment并仅更改了 API 项目配置的连接字符串。

接下来,我打开了我的项目属性并添加了两个用于调试的配置文件。为了解决这个问题,我为 API 项目和 UI 项目创建了这些相同的配置文件。这些配置文件被命名为“IIS Local”和另一个“IIS Dev Server”。最后,在每个新配置文件的每个项目页面中,我为ASPNETCORE_ENVIRONMENT--Development和输入了它们各自的值LocalDevelopment

当我将应用程序调试为Development, it works fine. However, when I run the application using theLocalDevelopment 环境和配置文件时,我收到以下错误:

错误。处理您的请求时发生错误。请求 ID:0HLLE04D5NFDU:00000001

开发模式切换到开发环境将显示有关所发生错误的更详细信息。

不应在已部署的应用程序中启用开发环境,因为它可能导致向最终用户显示异常的敏感信息。对于本地调试,可以通过将 ASPNETCORE_ENVIRONMENT 环境变量设置为 Development 并重新启动应用程序来启用开发环境。

这似乎并不成立,因为两个配置对于​​它们各自的项目都是相同的,唯一的区别是 API 中的连接字符串,而且我确实添加了一个EnvironmentName用于标识的属性。

我可能做错了什么?

这是LocalDevelopment文件的内容。以防万一我错过了什么。

API 中的设置

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "EnvironmentName": "LOCAL",
  "ConnectionStrings": {
    "Database": "xxx"
  }
}

用户界面中的设置

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

标签: azureasp.net-coreasp.net-core-configuration

解决方案


在您的 Startup.cs 中,您的方法中可能包含以下内容Configure

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseDatabaseErrorPage();
}
else
{
    app.UseExceptionHandler("/error/500");
}

您需要将条件更改为:

if (env.IsDevelopment() || env.IsEnvironment("LocalDevelopment"))

或者您可以使用开发错误页面简单地创建任何非生产环境:

if (!env.IsProduction())

IsDevelopment,等方法IsProduction只是语法糖,所以您不必这样做IsEnvironment("Development")。但是,由于LocalDevelopment是您自己创建的,因此显然没有内置的方法。


推荐阅读