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

时间:2019-03-21 13:51:13

标签: azure asp.net-core asp.net-core-configuration

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

通常,一旦您脱离了“开发”状态,就想关闭开发/调试设置,以防止敏感信息泄漏到网络上,以防应用程序崩溃。这是有道理的。

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

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

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

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

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

当我在Development, it works fine. However, when I run the application using the LocalDevelopment`环境和配置文件中调试应用程序时,出现以下错误:

  

错误。处理您的请求时发生错误。要求编号: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"
    }
  }
}

1 个答案:

答案 0 :(得分:1)

在Startup.cs中,您的Configure方法中可能会有类似以下内容的内容:

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

您需要将条件更改为:

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

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

if (!env.IsProduction())

IsDevelopmentIsProduction等方法只是语法糖,因此您不必执行IsEnvironment("Development")。但是,由于LocalDevelopment是您自己创建的,因此显然没有内置的方法。