Working with multiple environments
2017-03-06 11:47
197 查看
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
除了基于当前环境使用完全独立的Startup类之外,还可以调整应用程序在启动类中的配置方式。 Configure()和ConfigureServices()方法支持类似于Startup类本身的特定于环境的版本,形式为Configure {EnvironmentName}()和Configure {EnvironmentName} Services()。 如果定义一个方法ConfigureDevelopment(),当环境设置为开发时,它将被调用而不是Configure()。 同样,在同一环境中将调用ConfigureDevelopmentServices()而不是ConfigureServices()。
Summary
ASP.NET Core提供了许多功能和约定,允许开发人员轻松控制他们的应用程序在不同环境中的行为。 当将应用程序从开发发布到临时发布到生产时,适当设置环境变量,根据需要优化应用程序的配置来进行调试,测试或生产使用。相关文章推荐
- Working with Multiple Environments(使用多个环境)
- Redis学习笔记II-Working with Multiple Databases
- Redis学习笔记II-Working with Multiple Databases
- Changes in Agile - lesson on working with multiple teams
- Managing Multiple Configuration File Environments with Pre-Build Events
- [论文笔记] Live Migration of Multiple Virtual Machines with Resource Reservation in Cloud Computing Environments (CLOUD, 2011)
- 知识库--Working with Multiple Actors No Using Thread Pool (139)
- Working with multiple data-sources in UITableView
- Working with Multiple Forms in Visual Basic .NET: Upgrading to .NET
- Working with Tablespaces
- Working with DVT Components
- [Machine Learning (Andrew NG courses)]IV.Linear Regression with Multiple Variables
- Working with Report Snapshots in SQL Server Reporting Services Hyperlink
- Working with textures in android's OpenGL/ES.
- Working with Linear Models
- Android Material Design-Working with Drawables(使用Drawable)-(五)
- Working with large data sets in MySQL
- Asp.Net Web API 2第十八课——Working with Entity Relations in OData
- OpenOffice.org Code Snippets--Working with a Presentation Document in C++
- Working with UITableView in Xcode 5 Using Storyboard