ASP.NET Core引入了对多个环境(例如开发,暂存和生产环境)的支持。 可以用环境变量来指示应用程序正在运行的环境,从而让app来做相应的配置。

Development, Staging, Production

ASP.NET Core引用特定的环境变量ASPNETCORE_ENVIRONMENT来描述app当前正在运行的环境。此变量可以设置为任何您喜欢的值,但按照惯例有三个值:开发,暂存和生产。 您将在ASP.NET Core随附的示例和模板中找到这些值如何使用。

Note:

在Windows和macOS上,指定的环境名称不区分大小写。 无论是将变量设置为Development还是development或DEVELOPMENT,结果都是一样的。 但是,默认情况下,Linux是区分大小写的操作系统。 环境变量,文件名和设置应该要以区分大小写的标准来设定。

Development

对于visual studio 2017的app来说,环境变量设置在Properties文件夹中的launchSettings.json文件。

它可以配置多个启动模式,比如让IIS Express运行在Staging模式下:

{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:40088/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express (Staging)": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}
}
}

Note:

对项目配置文件或launchSettings.json直接执行的更改可能不会生效,直到重新启动Web服务器

Warning:

存储在launchSettings.json中的环境变量不以任何方式保护,并且如果您在此文件中使用环境变量,它将是项目的源代码存储库的一部分。 所以切勿在此文件中存储凭据或其他机密数据。 如果您需要一个地方来存储此类数据,请使用Secret Manager工具。

Staging

按照惯例,暂存环境是用于在部署到生产之前的最终测试的预生产环境。 所以我们应当尽量让其物理特性应与生产的相对应,使得生产中可能出现的任何问题,首先发生在暂存环境中,在那里它们可以被修复而不影响用户。

Production

生产环境是app的线上版本,由最终用户使用时运行的环境。 应该通过正确的配置,最大限度地提高此环境的安全性,性能和应用程序鲁棒性。 生产环境可能具有的不同于开发的一些常见设置包括:

  • 打开缓存
  • 确保所有客户端资源都打包,最小化,并尽可能从CDN提供
  • 关闭诊断ErrorPages
  • 打开友好的错误页面
  • 启用生产日志记录和监视(例如,Application Insights)

这绝不是一个完整的列表。

另外推荐在可能的情况下仅在应用程序的Startup类中执行环境检查,避免在其他地方多次进行重复检查。

如何确定当前Web运行的环境

在运行dotnet run之后,console会输出:

Hosting environment: Production
Content root path: /app
Now listening on: http://*:5000
Application started. Press Ctrl+C to shut down.

Hosting environment指定了当前运行的环境

Setting the environment

windows:

setx ASPNETCORE_ENVIRONMENT "Development"

如果不生效,则直接在windows的环境变量中设置:计算机->属性->高级->环境变量

Linux:

export command

Determining the environment at runtime

IHostingEnvironment服务提供了使用环境的核心抽象。 此服务由ASP.NET托管层提供,可以通过依赖注入注入到启动逻辑中。 Visual Studio中的ASP.NET Core网站模板使用此方法加载特定于环境的配置文件(如果存在)并自定义应用程序的错误处理设置。 在这两种情况下,通过在传递到相应方法中的IHostingEnvironment实例和调用EnvironmentName或IsEnvironment来引用当前指定的环境来实现此行为。

Note:

如果需要检查应用程序是否在特定环境中运行,请使用env.IsEnvironment(“environmentname”),因为它将正确忽略大小写(而不是检查env.EnvironmentName ==“Development”)。

例如,您可以在Configure方法中使用以下代码来设置特定于环境的错误处理:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
}

如果应用程序在开发环境中运行,那么它将启用在Visual Studio中使用“BrowserLink”功能所必需的运行时支持,特定于开发的错误页面(通常不应在生产环境中运行)和特殊的数据库错误页面(提供了一种应用迁移的方法,因此应该仅在开发中使用)。 否则,如果应用程序未在开发环境中运行,则会将标准错误处理页面配置为显示以响应任何未处理的异常。

您可能需要确定在运行时将哪些内容发送到客户端,具体取决于当前环境。 例如,在开发环境中,通常提供非最小化的javscript和style sheets,因为这样方便调试。 生产和测试环境应部署最小化版本,通常来自CDN。 您可以使用环境标记助手执行此操作。 如果当前环境与使用names属性指定的环境之一匹配,则Environment标记帮助器将仅呈现其中描述的内容。

<environment names="Development">
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

To get started with using tag helpers in your application see Introduction to Tag Helpers(https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/tag-helpers/intro)

Startup conventions

ASP.NET Core支持基于约定的方法来配置app基于当前环境来启动。 您还可以通过编程方式控制app的行为,根据它所在的环境,允许您创建和管理自己的约定。

当ASP.NET Core应用程序启动时,启动类用于引导应用程序,加载其配置设置等(了解有关ASP.NET启动的更多信息,https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/startup)。 但是,如果存在一个名为Startup {EnvironmentName}(例如StartupDevelopment)的类,并且ASPNETCORE_ENVIRONMENT环境变量匹配该名称,那么将使用该Startup类。 因此,您可以将Startup配置为开发环境调用,但有一个单独的StartupProduction类,当app在生产环境中运行时使用。 或相反亦然。

Note

Calling WebHostBuilder.UseStartup() overrides configuration sections.

除了基于当前环境使用完全独立的Startup类之外,还可以调整应用程序在启动类中的配置方式。 Configure()和ConfigureServices()方法支持类似于Startup类本身的特定于环境的版本,形式为Configure {EnvironmentName}()和Configure {EnvironmentName} Services()。 如果定义一个方法ConfigureDevelopment(),当环境设置为开发时,它将被调用而不是Configure()。 同样,在同一环境中将调用ConfigureDevelopmentServices()而不是ConfigureServices()。

Summary

ASP.NET Core提供了许多功能和约定,允许开发人员轻松控制他们的应用程序在不同环境中的行为。 当将应用程序从开发发布到临时发布到生产时,适当设置环境变量,根据需要优化应用程序的配置来进行调试,测试或生产使用。

Working with multiple environments的更多相关文章

  1. Java资源大全中文版(Awesome最新版)

    Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安全.代码分析.日志.第三方库.书籍.Java 站 ...

  2. ASP.NET Core 介绍

    原文:Introduction to ASP.NET Core 作者:Daniel Roth.Rick Anderson.Shaun Luttin 翻译:江振宇(Kerry Jiang) 校对:许登洋 ...

  3. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  4. ASP.NET Core 中文文档 第三章 原理(2)中间件

    原文:Middleware 作者:Steve Smith.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicationBu ...

  5. ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作

    原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...

  6. 000.Introduction to ASP.NET Core--【Asp.net core 介绍】

    Introduction to ASP.NET Core Asp.net core 介绍 270 of 282 people found this helpful By Daniel Roth, Ri ...

  7. [译]ASP.NET 5 Configuration

    原文:https://docs.asp.net/en/latest/fundamentals/configuration.html ASP.NET 5支持多种配置选项. 应用的配置文件可以是JSON, ...

  8. 《Continuous Integration》读书笔记

    Trigger a Build whenever a change occurs. it can help us reduce assumptions on a projecvt by rebuild ...

  9. Learning WCF Chapter1 Creating a New Service from Scratch

    You’re about to be introduced to the WCF service. This lab isn’t your typical “Hello World”—it’s “He ...

随机推荐

  1. Jordan 标准型的实例

    将学习到什么 练习一下如何把一个矩阵化为 Jordan 标准型.   将矩阵化为 Jordan 标准型需要三步: 第一步 求出矩阵 \(A \in M_n\) 全部的特征值 \(\lambda_1,\ ...

  2. blog.yiz96.com

    欢迎访问我的新博客 blog.yiz96.com

  3. OpenCV2:介绍

    一.OpenCV简介 OpenCV所有的类和函数都在cv命名空间里面,可以用 using namespace cv; #include "opencv2/opencv.hpp" 1 ...

  4. ios多线程NSThread

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...

  5. (13)zabbix External checks 外部命令检测

    1.  概述 zabbix server运行脚本或者二进制文件来执行外部检测,外部检测不需要在被监控端运行任何agentd item key语法如下: ARGUMENT DEFINITION scri ...

  6. 前端用户体验优化: JS & CSS 各类效果代码段

    前言 不定时更新 在线预览 https://zzyper.github.io/opti... 在线预览的源码 https://github.com/zzyper/opt... 部分内容仅兼容webki ...

  7. 【支付宝支付】扫码付和app支付,回调验证签名失败问题

    在检查了参数排序,编码解码,文件编码等问题后,发现还是签名失败,最后找出原因: 扫码付和app支付采用的支付宝公钥不一样   Pid和公钥管理里面:   开放平台密钥界面和开放平台应用界面的密钥应该一 ...

  8. linux定时任务执行php任务

    首先用命令检查服务是否在运行 systemctl status crond.service 如果服务器上没有装有crontab ,则可以执行 yum install vixie-cron yum in ...

  9. 组队赛Day1第一场 GYM 101350 G - Snake Rana (容斥)

    [题意] 给一个N×M的矩阵, K个地雷的坐标.求不含地雷的所有矩形的总数. T组数据. N M都是1e4,地雷数 K ≤ 20 Input 3 2 2 1 2 2 6 6 2 5 2 2 5 100 ...

  10. Java技术——Java中的内存泄漏

    . OOM的常见类型 按照JVM规范,JAVA虚拟机在运行时会管理以下的内存区域: 程序计数器:当前线程执行的字节码的行号指示器,线程私有. JAVA虚拟机栈:Java方法执行的内存模型,每个Java ...