天天看点

ASP.NET Core 多环境工作

环境

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

  • DOTNET_ENVIRONMENT
  • ASPNETCORE_ENVIRONMENT(当调用 ConfigureWebHostDefaults 时)。 默认 ASP.NET Core Web 应用模板调用 ConfigureWebHostDefaults。 ASPNETCORE_ENVIRONMENT 值替代 DOTNET_ENVIRONMENT。

ASP.NET Core 介绍了支持在多个环境中管理应用程序行为的改进,如开发(development),预演(staging)和生产(production)。环境变量用来指示应用程序正在运行的环境,允许应用程序适当地配置。

开发,预演,生产

IHostEnvironment.EnvironmentName 可以设置为任意值,但是框架提供了下列值:

  • Development:launchSettings.json 文件将本地计算机上的 ASPNETCORE_ENVIRONMENT 设置为 Development。
  • Staging
  • Production:没有设置 DOTNET_ENVIRONMENT 和 ASPNETCORE_ENVIRONMENT 时的默认值。

注意:

指定的环境变量名称不区分大小写。无论你把变量设置为 Development 或者 development 或者 DEVELOPMENT 的结果将会是相同的。

项目配置文件或 launchSettings.json 所做的更改在使用的 web 服务器重启之前可能不会直接生效(尤其是, kestrel 在将要检测它的环境变化之前必须重启)。

开发:在开发应用程序时所使用的环境。当使用 Visual Studio 时,这个设置可以在项目的调试配置文件中指定,比如 IIS Express

预演:Staging 环境是用于部署到生产环境前进行最后测试的预生产环境。理想的情况下,它的物理特征应该是生产环境的真实写照,因此生产环境中可能出现的任何问题都首先发生在预演环境中,在这里可以解决它们而不影响到用户。

生产:Production 环境是应用程序运行的环境,它是活动的并且被终端用户使用。这个环境应该被配置为最大限度提高安全性,性能和应用程序的健壮性。生产环境不同于开发环境的一些通用的设置包括:

  • 启用缓存
  • 确保所有的客户端资源被打包,压缩和尽可能从CDN提供
  • 关闭诊断错误页面
  • 启用友好的错误页面
  • 启用生产日志和监控

在运行时确定环境

IHostingEnvironment 服务为工作环境提供了核心抽象。该服务由 ASP.NET 宿主层提供,并且能够通过 Dependency Injection 注入到你的启动逻辑中。在 Visual Studio 中的 ASP.NET Core 网站模板使用这种方式来加载特定的环境配置文件(如果存在的话)并且自定义应用程序的错误处理设置。在这两种情况下,这种行为是由通过参照当前指定的环境来调用 IHostingEnvironment 的实例上的 EnvironmentName 或 IsEnvironment 上传递到适当的方法来实现。

启动约定

Startup 类约定

当 ASP.NET Core 应用启动时,Startup 类启动应用。 应用可以为不同的环境定义多个 Startup 类。 在运行时选择适当的 Startup 类。 优先考虑名称后缀与当前环境相匹配的类。 如果找不到匹配的 Startup{EnvironmentName},就会使用 Startup 类。 当应用需要为各环境之间存在许多代码差异的多个环境配置启动时,这种方法非常有用。

Startup 方法约定

除了使用Startup 类约定为不同的环境下执行不同定义的Startup 类之外,还可以使用Startup 方法约定为不同的环境下执行Startup 类下不同定义的 的ConfigureServices和Configure方法。以下为开发,分阶段,生产,默认的四种ConfigureServices和Configure约定命名方法

ConfigureDevelopmentServices

ConfigureStagingServices

ConfigureProductionServices

ConfigureServices

ConfigureDevelopment

ConfigureStaging

ConfigureProduction

Configure

launchSettings.json

开发环境可以启用不应该在生产中公开的功能。 例如,ASP.NET Core 模板在开发环境中启用了开发人员异常页。

本地计算机开发环境可以在项目的 Properties\launchSettings.json 文件中设置。 在 launchSettings.json 中设置的环境值替代在系统环境中设置的值。

launchSettings.json 文件:

  • 仅在本地开发计算机上使用。
  • 未部署。
  • 包含配置文件设置。
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:64645",
      "sslPort": 44366
    }
  },

  //IIS Express:在 Visual Studio 中启动应用时使用的默认配置文件。 由于 "commandName" 键的值为 "IISExpress",因此 IISExpress 是 Web 服务器
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },

    //可以将启动配置文件设置为此项目或所包含的其他任何配置文件。 选择项目名称会启动 Kestrel Web 服务器。
    //EnvironmentsSample:配置文件名称是项目名称。 当使用 dotnet run 启动应用时,默认使用此配置文件。 
    //由于 "commandName" 键的值为 "Project",因此启动的是 Kestrel Web 服务器。
    "EnvironmentsSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

           

以下 launchSettings.json 文件包含多个配置文件:

{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:64645",
      "sslPort": 44366
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IISX-Production": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    },
    "IISX-Staging": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging",
        "ASPNETCORE_DETAILEDERRORS": "1",
        "ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "3"
      }
    },
    "EnvironmentsSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "KestrelStaging": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    }
  }
}

           

在命令行界面中使用 dotnet run 命令,并将 --launch-profile 选项设置为配置文件名称。 这种方法只支持 Kestrel 配置文件:dotnet run --launch-profile “SampleApp”

参考:

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

https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_11-environments.html

继续阅读