Working with Multiple Environments
ASP.NET 5提高了跨多环境控制应用程序行为的支持。比如:开发,过度,生产。环境变量用来表明应用程序运行的环境,允许适当配置应用程序。
In this article(在这篇文章中主要介绍的章节如下):
• Development, Staging, Production
• Determining the environment at runtime
• Startup conventions Browse or download samples on GitHub.
Development, Staging, Production
ASP.NET 5引用特定的环境变量。ASPNET_ENV(or Hosting:Environment)描述了当前正在运行的应用程序的环境。这个变量可以设置任何值,但是按照惯例使用三个值,分别为:Development, Staging, and Production。您将发现这些值用于ASP.NET 5提高那个的样品和模板中。
当前环境设置能从ASP.NET 5检测到所使用的编程方式,此外,ASP.NET MVC6介绍了Environment Tag Helper,Environment Tag Helper允许MVC视图包括基于当前应用程序环境的某些部分。
Development
下面是开发应用程序时使用的环境。用Visual Studio 2015时,在项目的调试配置文件中指定环境设置,比如IIS Express,如下图所示:
当修改已创建项目的默认设置,更改在Properties文件夹中的launchSettings.json中被持久化, 包括用到的任何环境变量。在Web配置文件改变 ASPNET_ENV (or Hosting:Environment) 变量为Staging之后,launchSettings.json文件如下所示:
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:40088/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNET_ENV": "Development" } }, "web": { "commandName": "web", "environmentVariables": { "Hosting:Environment": "Staging" } } } }
Staging环境是预生产环境,在生产环境之前用来最终测试,理想的情况是,它的物理特性能反应项目产品 ,以至于任何问题在Staging环境中第一次出现时就能解决而不影响客户的使用。
Production(产品)
应用程序运行并被用户使用的环境是Procuction环境。这个环境应该被配置最大的安全性,性能和应用程序的健壮性,production环境中可能有的一些公共设置和开发时有所不同,包括以下。
Turn on caching
Ensure all client-side resources are bundled, mini?ed, and potentially served from a CDN
Turn off diagnostic ErrorPages
Turn on friendly error pages
Enable production logging and monitoring (for example, Application Insights)
这不是一个完整的列表,最好避免在应用程序的很多部分进行分散环境检查。相反,推荐的方法是尽量在应用程序的Startup类(cs)中执行这种检查。
Determining the environment at runtime(在运行时决定使用环境)
为了正常工作,IHostingEnvironment服务提供了带有环境的核心抽象概念,ASP.NET hosting层提供了该服务并且通过依赖注入将这个服务注入到启动逻辑中。Visual Studio中的ASP.NET 5 网站模板用这种方法加载特定环境的配置文件(if present),并自定义应用程序的错误处理设置。在这2种情况下,目前指定环境通过调用 EnvironmentName 或者IsEnvironment 将IHostingEnvironment 的实例传递给适当的方法来实现这种行为的。
如果需要检查在特定的环境中,应用程序是否运行,用env.IsEnvironment("environmentname") ,它能正确地忽略大小写。
例如,可以使用以下代码在Con?gure方法中设置环境的具体错误操作:
if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); }
如果应用程序在开发环境中正常运行,它可能BrowserLink ,开发特定的错误页,否则,配置一个标准的错误页作为对任何未处理异常的响应显示出来。
Startup conventions(启动约定)
ASP.NET 5支持基于协议的方法在当前环境中配置应用程序的启动。也可以根据环境通过编程的方式控制应用程序的执行,并允许创建和管理自己的协议。
当ASP.NET应用程序启动时,启动类启动应用程序,加载配置设置等(到ASP.NET startup了解更多)。然而,如果存在名为Startup{EnvironmentName}的类,(比如StartupDevelopment),ASPNET_ENV环境变量和这个名相匹配,使用启动类。开发时可以配置启动项,当应用程序在Production的环境中运行,将使用一个单独的StartupProduction。反之亦然。
当应用程序在Development环境中被设置成运行,以下示例项目中的StartupDevelopment将运行。
在开发期间,运行应用程序,显示欢迎屏幕,示例还包括一个StartupStaging类:
当ASPNET_ENV设置成Staging,并且应用程序运行,使用StartupStaging类,应用程序将显示字符串声明,并运行在staging 环境中。当环境没有设置成Development或者是Staging时,会运行应用程序默认的Startup类。(据推测,设置为Production,而不是仅限于这三个选项。还要注意,如果没有环境设置,运行默认启动)。
除了在当前环境下使用完全独立的Startup类,也可以重新在Startup类中配置应用。Configure[Environment]() 和 Configure[Environment]Services()中的Configure()和ConfigureServices()方法支持特定环境的版本,和Startup类本身类似。如果定义了ConfigureDevelopment方法,当环境设置为development时,它将被调用,而不是调用Configure(),同样,在同样的环境中ConfigureDevelopmentServices()方法将被调用,而不是ConfigureServices()方法。
using Microsoft.AspNet.Builder;namespace Environments { public class StartupDevelopment { public void Configure(IApplicationBuilder app) { app.UseWelcomePage(); } } }
using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Environments { public class StartupStaging { public void Configure(IApplicationBuilder app) { app.Run(async context => { context.Response.ContentType = "text/plain"; await context.Response.WriteAsync("Staging environment."); }); } } }
总结
ASP.NET 5提供类很多特性和协议,允许开发人员在不同的环境中控制应用程序如何执行。当发布应用程序从development到staging到production。环境变量设置适当的环境,允许对应用程序调试,测试或者使用进行优化。
更多资源
Con?guration