This post has been updated to reflect Core 1.0 RC2 which was release mid may 2016.
Getting Started
A full list of environment variables can be founder here.
In RC 1, the environment variables are set up in Properties > launchSettings.json.
What are Environment Variables?
“ASP.NET Core introduces improved support for controlling application behavior across multiple environments, such as development, staging, and production. Environment variables are used to indicate which environment the application is running in, allowing the app to be configured appropriately.” – from docs.asp.net
In short, its common and easy to set up different environments such as:
- Development
- Staging
- Production
And these “environments” have “environment variables” that can affect what your application does during run-time. Further more, you can build logic into your application, instructing it to perform different behaviors based upon its “environment”.
The ASPNETCORE_ENVIRONMENT variable
The ASPNETCORE_ENVIRONMENT (formerly known as ASPNET_ENV) variable defines what environment you are running in, and if you have a startup class ending with this name then it will be call the configure method of that class instead of Startup.cs. e.g. StartupDEV if ASPNETCORE_ENVIRONMENT is equal to DEV
Startup.cs
To reference your hosting environment in Startup.cs you will need to inject IHostingEnvironment. IHostingEnvironment is needed because it contains a property name “EnvironmentName”. You can inject this into any method, but we want to inject it into the Startup() method.
public Startup(IHostingEnvironment env) { // Set up configuration sources. var builder = new ConfigurationBuilder() .AddJsonFile("appsettings.json"); if (env.IsEnvironment("Development")) { builder.AddApplicationInsightsSettings(developerMode: true); } else if (env.IsEnvironment("Staging")) { //else if staging } else { //else... do something cool } builder.AddEnvironmentVariables(); Configuration = builder.Build().ReloadOnChanged("appsettings.json"); }
You can also reference them this way:
env.IsDevelopment() env.IsProduction() env.IsStaging()
Here is a list from the doc.asp.net blog listing examples of features you would only want in production.
- Turn on caching
- Ensure all client-side resources are bundled, minified, and potentially served from a CDN
- Turn off diagnostic ErrorPages
- Turn on friendly error pages
- Enable production logging and monitoring (for example, Application Insights)
And here is an example of turning on Application Insights only for production:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if(env.IsProduction()) { app.UseApplicationInsightsRequestTelemetry(); app.UseApplicationInsightsExceptionTelemetry(); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
Setting your Environment Variable and launchSettings.json
There are a few ways to set your Environment Variables. You can add the variable to your machine in your control panel under Advanced System Settings > Environment Variables (but you would have to do this to all of the places you run/test/develop) OR you can hard code some variable values in launchSetting.json for certain situations.
I prefer to do the latter for dev and staging.
The below example will set your ASPNETCORE_ENVIRONMENT to “Development” when running in Visual Studio, it will set it to “Staging” when published to a staging site. For production, if you have a system environment variable named ASPNETCORE_ENVIRONMENT (set to “Production”) wherever you host your production site, your app will then be set to “Production”.
Note: the variables them-self are case insensitive.
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:XXXXX", "sslPort": XXXXX } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "web": { "commandName": "web", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Staging" } } } }