From a6eed04885e03458ca36d11ec5881d3a9bb627dd Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Wed, 27 Aug 2025 09:20:14 -0400 Subject: [PATCH 01/10] Environments overhaul --- aspnetcore/fundamentals/environments.md | 543 ++++++++---------- .../_static/project-properties-debug.png | Bin 35867 -> 0 bytes 2 files changed, 229 insertions(+), 314 deletions(-) delete mode 100644 aspnetcore/fundamentals/environments/_static/project-properties-debug.png diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 17d11f6ec9d5..6ba69174ec9f 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -1,29 +1,34 @@ --- -title: Use multiple environments in ASP.NET Core +title: Control app behavior across multiple environments in ASP.NET Core apps author: tdykstra description: Learn how to control app behavior across multiple environments in ASP.NET Core apps. monikerRange: '>= aspnetcore-3.1' ms.author: tdykstra ms.custom: mvc -ms.date: 09/18/2024 +ms.date: 08/26/2025 uid: fundamentals/environments --- -# Use multiple environments in ASP.NET Core +# Control app behavior across multiple environments in ASP.NET Core apps [!INCLUDE[](~/includes/not-latest-version.md)] -:::moniker range=">= aspnetcore-6.0" - -By [Rick Anderson](https://twitter.com/RickAndMSFT) and [Kirk Larkin](https://twitter.com/serpent5) - ASP.NET Core configures app behavior based on the runtime environment using an environment variable. For Blazor environments guidance, which adds to or supersedes the guidance in this article, see . ## Environments +:::moniker range=">= aspnetcore-7.0" + +To determine the runtime environment, ASP.NET Core reads from the following environment variables: + +1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) +1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when `WebApplicationBuilder` is used. For other hosts, such as `ConfigureWebHostDefaults` and `WebHost.CreateDefaultBuilder`, `ASPNETCORE_ENVIRONMENT` has higher precedence. + :::moniker-end + :::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0" + To determine the runtime environment, ASP.NET Core reads from the following environment variables: 1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) @@ -31,19 +36,18 @@ To determine the runtime environment, ASP.NET Core reads from the following envi :::moniker-end -:::moniker range=">= aspnetcore-7.0" +:::moniker range="< aspnetcore-6.0" + To determine the runtime environment, ASP.NET Core reads from the following environment variables: 1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) -1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when `WebApplicationBuilder` is used. For other hosts, such as `ConfigureWebHostDefaults` and `WebHost.CreateDefaultBuilder`, `ASPNETCORE_ENVIRONMENT` has higher precedence. +1. `ASPNETCORE_ENVIRONMENT` when is called. The default ASP.NET Core web app templates call `ConfigureWebHostDefaults`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. :::moniker-end -:::moniker range=">= aspnetcore-6.0" - `IHostEnvironment.EnvironmentName` can be set to any value, but the following values are provided by the framework: -* : The [launchSettings.json](#lsj) file sets `ASPNETCORE_ENVIRONMENT` to `Development` on the local machine. +* : The [launchSettings.json](#development-and-launchsettingsjson) file sets `ASPNETCORE_ENVIRONMENT` to `Development` on the local machine. * * : The default if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` have not been set. @@ -56,10 +60,25 @@ The following code: :::code language="csharp" source="environments/samples/6.x/EnvironmentsSample/Program.cs" id="First"::: +XXXXXXXXXXXXXX The 3.x version for less than 6.0 ...... + +The following code: + +* Calls when `ASPNETCORE_ENVIRONMENT` is set to `Development`. +* Calls when the value of `ASPNETCORE_ENVIRONMENT` is set to `Staging`, `Production`, or `Staging_2`. +* Injects into `Startup.Configure`. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. +* Is similar to the code generated by the ASP.NET Core templates. + +:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/Startup.cs" id="snippet"::: + +XXXXXXXXXXXXXXX + The [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of [IHostEnvironment.EnvironmentName](xref:Microsoft.Extensions.Hosting.IHostEnvironment.EnvironmentName) to include or exclude markup in the element: :::code language="cshtml" source="environments/samples/6.x/EnvironmentsSample/Pages/About.cshtml" id="snippet_Environment"::: +:::code language="cshtml" source="environments/samples/3.x/EnvironmentsSample/Pages/About.cshtml" id="snippet_Environment"::: + The [About page](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x/EnvironmentsSample/Pages/About.cshtml) from the [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x) includes the preceding markup and displays the value of `IWebHostEnvironment.EnvironmentName`. On Windows and macOS, environment variables and values aren't case-sensitive. Linux environment variables and values are case-sensitive by default. @@ -70,7 +89,7 @@ The [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore The following .NET CLI commands create and run a web app named *EnvironmentsSample*: -```bash +```dotnetcli dotnet new webapp -o EnvironmentsSample cd EnvironmentsSample dotnet run --verbosity normal @@ -78,7 +97,10 @@ dotnet run --verbosity normal When the app runs, it displays output similar to the following: -:::code language="bash" source="environments/samples/6.x/dnr-verbose.txt" highlight="8,10"::: +```dotnetcli +info: Microsoft.Hosting.Lifetime[0] + Hosting environment: Development +``` ### Set environment on the command line @@ -90,13 +112,14 @@ dotnet run --environment Production The preceding command sets the environment to `Production` and displays output similar to the following in the command window: -:::code language="bash" source="environments/samples/6.x/dnr-prod.txt" highlight="8"::: - - +```dotnetcli +info: Microsoft.Hosting.Lifetime[0] + Hosting environment: Production +``` ### Development and launchSettings.json -The development environment can enable features that shouldn't be exposed in production. For example, the ASP.NET Core project templates enable the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) in the development environment. Because of the performance cost, scope validation and dependency validation only happens in development. +The development environment can enable features that shouldn't be exposed in production. For example, the ASP.NET Core project templates enable the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) in the development environment. Because of the performance cost, scope validation and dependency validation only happens in development. The environment for local machine development can be set in the *Properties\launchSettings.json* file of the project. Environment values set in `launchSettings.json` override values set in the system environment. @@ -110,6 +133,8 @@ The following JSON shows the `launchSettings.json` file for an ASP.NET Core web :::code language="json" source="environments/samples/6.x/EnvironmentsSample/Properties/launchSettingsCopy.json"::: +:::code language="json" source="environments/samples/3.x/EnvironmentsSample/Properties/launchSettingsCopy.json"::: + The preceding JSON contains two profiles: * `EnvironmentsSample`: The profile name is the project name. As the first profile listed, this profile is used by default. The `"commandName"` key has the value `"Project"`, therefore, the [Kestrel web server](xref:fundamentals/servers/kestrel) is launched. @@ -126,21 +151,28 @@ The value of `commandName` can specify the web server to launch. `commandName` c * `IIS` : No web server launched. IIS is expected to be available. * `Project` : Launches Kestrel. -The Visual Studio 2022 project properties **Debug / General** tab provides an **Open debug launch profiles UI** link. This link opens a **Launch Profiles** dialog that lets you edit the environment variable settings in the `launchSettings.json` file. You can also open the **Launch Profiles** dialog from the **Debug** menu by selecting **\ Debug Properties**. Changes made to project profiles may not take effect until the web server is restarted. Kestrel must be restarted before it can detect changes made to its environment. +In Visual Studio, there are two approaches for setting the environment via the launch profiles: + +* Press Alt+Enter or select **Properties** after right-clicking the project in **Solution Explorer**. Select **Debug** > **General**, and select the **Open debug launch profiles UI** link. -:::image source="environments/_static/launch-profiles.png" alt-text="Project Properties Setting Environment variables"::: +* With the project selected in **Solution Explorer**, select **{PROJECT NAME} Debug Properties**, where the `{PROJECT NAME}` placeholder is a project name, from the **Debug** menu. -The following `launchSettings.json` file contains multiple profiles: +The preceding approaches open the **Launch Profiles** dialog where you can edit the environment variable settings in the `launchSettings.json` file. Changes made to project profiles may not take effect until the web server is restarted. Kestrel must be restarted before it can detect changes made to its environment. -:::code language="json" source="environments/samples/6.x/EnvironmentsSample/Properties/launchSettings.json"::: +Inspect the launch profiles directly (and edit the environment variable directly) in the `Properties/launchSettings.json` file: -Profiles can be selected: +```json +"environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" +} +``` + +Profiles can be selected in the Visual Studio UI next to the Start button (►). -* From the Visual Studio UI. -* Using the [`dotnet run`](/dotnet/core/tools/dotnet-run) CLI command with the `--launch-profile` option set to the profile's name. *This approach only supports Kestrel profiles.* +* Using the [`dotnet run`](/dotnet/core/tools/dotnet-run) command with the [`-lp|--launch-profile` option](/dotnet/core/tools/dotnet-run#options) set to the profile's name. *This approach only supports Kestrel profiles.* ```dotnetcli - dotnet run --launch-profile "EnvironmentsSample" + dotnet run -lp "EnvironmentsSample" ``` > [!WARNING] @@ -148,7 +180,12 @@ Profiles can be selected: When using [Visual Studio Code](https://code.visualstudio.com/), environment variables can be set in the `.vscode/launch.json` file. The following example sets several [environment variables for Host configuration values](xref:fundamentals/host/web-host#host-configuration-values): -:::code language="json" source="environments/samples/6.x/EnvironmentsSample/.vscode/launch.json" range="4-10,32-38"::: +```json +"env": { + "ASPNETCORE_ENVIRONMENT": "Development", + ... +}, +``` The `.vscode/launch.json` file is used only by Visual Studio Code. @@ -186,7 +223,7 @@ To set the environment in an [Azure App Service](https://azure.microsoft.com/ser Azure App Service automatically restarts the app after an app setting is added, changed, or deleted in the Azure portal. -### Windows - Set environment variable for a process +### Windows: Set environment variable for a process Environment values in `launchSettings.json` override values set in the system environment. @@ -202,7 +239,7 @@ $Env:ASPNETCORE_ENVIRONMENT = "Staging" dotnet run --no-launch-profile ``` -### Windows - Set environment variable globally +### Windows: Set environment variable globally The preceding commands set `ASPNETCORE_ENVIRONMENT` only for processes launched from that command window. @@ -230,13 +267,15 @@ To set the value globally in Windows, use either of the following approaches: When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for `dotnet run` in any command window opened after the value is set. Environment values in `launchSettings.json` override values set in the system environment. -### Windows - Use web.config +### Windows: IIS + +#### Set the environment variable in the `web.config` file To set the `ASPNETCORE_ENVIRONMENT` environment variable with `web.config`, see the *Set environment variables* section of . -### Windows - IIS deployments +#### Set the environment variable on deployment to IIS -Include the `` property in the [publish profile (.pubxml)](xref:host-and-deploy/visual-studio-publish-profiles) or project file. This approach sets the environment in *web.config* when the project is published: +Include the `` property in the [publish profile (.pubxml)](xref:host-and-deploy/visual-studio-publish-profiles) or project file. This approach sets the environment in `web.config` when the project is published: ```xml @@ -255,341 +294,219 @@ When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` e Setting the current environment for macOS can be performed in-line when running the app: -```bash +```dotnetcli ASPNETCORE_ENVIRONMENT=Staging dotnet run ``` Alternatively, set the environment with `export` prior to running the app: -```bash +```dotnetcli export ASPNETCORE_ENVIRONMENT=Staging ``` Machine-level environment variables are set in the *.bashrc* or *.bash_profile* file. Edit the file using any text editor. Add the following statement: -```bash +```dotnetcli export ASPNETCORE_ENVIRONMENT=Staging ``` ### Linux -For Linux distributions, use the `export` command at a command prompt for session-based variable settings and the *bash_profile* file for machine-level environment settings. +For Linux distributions, use the `export` command at a command prompt for session-based variable settings and the `bash_profile` file for machine-level environment settings. ## Set the environment in code -To set the environment in code, use when creating , as shown in the following example: - -:::code language="csharp" source="environments/samples/6.x/EnvironmentsSample/Program.cs" id="SetInCode" highlight="1-4"::: - -## Configuration by environment - -To load configuration by environment, see . - -## Configure services and middleware by environment - -Use or to conditionally add services or middleware depending on the current environment. The project template includes an example of code that adds middleware only when the current environment isn't Development: - -:::code language="csharp" source="environments/samples/6.x/EnvironmentsSample/Program.cs" id="First" highlight="9-14"::: - -The highlighted code checks the current environment while building the request pipeline. To check the current environment while configuring services, use `builder.Environment` instead of `app.Environment`. +:::moniker range=">= aspnetcore-6.0" -## Additional resources +To set the environment in code, use when creating , as shown in the following example: -* [View or download sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples) ([how to download](xref:index#how-to-download-a-sample)) -* -* -* +```csharp +var builder = WebApplication.CreateBuilder(new WebApplicationOptions +{ + EnvironmentName = Environments.Staging +}); +``` :::moniker-end :::moniker range="< aspnetcore-6.0" -By [Rick Anderson](https://twitter.com/RickAndMSFT) and [Kirk Larkin](https://twitter.com/serpent5) - -ASP.NET Core configures app behavior based on the runtime environment using an environment variable. - -## Environments - -To determine the runtime environment, ASP.NET Core reads from the following environment variables: - -1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) -1. `ASPNETCORE_ENVIRONMENT` when is called. The default ASP.NET Core web app templates call `ConfigureWebHostDefaults`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. - -`IHostEnvironment.EnvironmentName` can be set to any value, but the following values are provided by the framework: - -* : The [launchSettings.json](#lsj) file sets `ASPNETCORE_ENVIRONMENT` to `Development` on the local machine. -* -* : The default if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` have not been set. - -The following code: - -* Calls when `ASPNETCORE_ENVIRONMENT` is set to `Development`. -* Calls when the value of `ASPNETCORE_ENVIRONMENT` is set to `Staging`, `Production`, or `Staging_2`. -* Injects into `Startup.Configure`. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. -* Is similar to the code generated by the ASP.NET Core templates. - -:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/Startup.cs" id="snippet"::: - -The [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of [IHostEnvironment.EnvironmentName](xref:Microsoft.Extensions.Hosting.IHostEnvironment.EnvironmentName) to include or exclude markup in the element: - -:::code language="cshtml" source="environments/samples/3.x/EnvironmentsSample/Pages/About.cshtml" id="snippet_Environment"::: - -The [About page](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/3.x/EnvironmentsSample/Pages/About.cshtml) from the [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/3.x) includes the preceding markup and displays the value of `IWebHostEnvironment.EnvironmentName`. - -On Windows and macOS, environment variables and values aren't case-sensitive. Linux environment variables and values are **case-sensitive** by default. - -### Create EnvironmentsSample - -The [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/3.x) used in this document is based on a Razor Pages project named *EnvironmentsSample*. - -The following code creates and runs a web app named *EnvironmentsSample*: - -```bash -dotnet new webapp -o EnvironmentsSample -cd EnvironmentsSample -dotnet run --verbosity normal -``` - -When the app runs, it displays some of the following output: - -```bash -Using launch settings from c:\tmp\EnvironmentsSample\Properties\launchSettings.json -info: Microsoft.Hosting.Lifetime[0] - Now listening on: https://localhost:5001 -info: Microsoft.Hosting.Lifetime[0] - Application started. Press Ctrl+C to shut down. -info: Microsoft.Hosting.Lifetime[0] - Hosting environment: Development -info: Microsoft.Hosting.Lifetime[0] - Content root path: c:\tmp\EnvironmentsSample -``` - - - -### Development and launchSettings.json - -The development environment can enable features that shouldn't be exposed in production. For example, the ASP.NET Core templates enable the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) in the development environment. - -The environment for local machine development can be set in the *Properties\launchSettings.json* file of the project. Environment values set in `launchSettings.json` override values set in the system environment. - -The `launchSettings.json` file: - -* Is only used on the local development machine. -* Is not deployed. -* contains profile settings. - -The following JSON shows the `launchSettings.json` file for an ASP.NET Core web project named *EnvironmentsSample* created with Visual Studio or `dotnet new`: - -:::code language="json" source="environments/samples/3.x/EnvironmentsSample/Properties/launchSettingsCopy.json"::: - -The preceding markup contains two profiles: - -* `IIS Express`: The default profile used when launching the app from Visual Studio. The `"commandName"` key has the value `"IISExpress"`, therefore, [IISExpress](/iis/extensions/introduction-to-iis-express/iis-express-overview) is the web server. You can set the launch profile to the project or any other profile included. For example, in the image below, selecting the project name launches the [Kestrel web server](xref:fundamentals/servers/kestrel). - - :::image source="environments/_static/iisx2.png" alt-text="IIS Express launch on menu"::: -* `EnvironmentsSample`: The profile name is the project name. This profile is used by default when launching the app with `dotnet run`. The `"commandName"` key has the value `"Project"`, therefore, the [Kestrel web server](xref:fundamentals/servers/kestrel) is launched. - -The value of `commandName` can specify the web server to launch. `commandName` can be any one of the following: - -* `IISExpress` : Launches IIS Express. -* `IIS` : No web server launched. IIS is expected to be available. -* `Project` : Launches Kestrel. - -The Visual Studio project properties **Debug** tab provides a GUI to edit the `launchSettings.json` file. Changes made to project profiles may not take effect until the web server is restarted. Kestrel must be restarted before it can detect changes made to its environment. - -:::image source="environments/_static/project-properties-debug.png" alt-text="Project Properties Setting Environment variables"::: - -The following `launchSettings.json` file contains multiple profiles: - -:::code language="json" source="environments/samples/3.x/EnvironmentsSample/Properties/launchSettings.json"::: - -Profiles can be selected: - -* From the Visual Studio UI. -* Using the [`dotnet run`](/dotnet/core/tools/dotnet-run) command in a command shell with the `--launch-profile` option set to the profile's name. *This approach only supports Kestrel profiles.* - - ```dotnetcli - dotnet run --launch-profile "SampleApp" - ``` - -> [!WARNING] -> `launchSettings.json` shouldn't store secrets. The [Secret Manager tool](xref:security/app-secrets) can be used to store secrets for local development. - -When using [Visual Studio Code](https://code.visualstudio.com/), environment variables can be set in the `.vscode/launch.json` file. The following example sets several [Host configuration values environment variables](xref:fundamentals/host/web-host#host-configuration-values): - -:::code language="json" source="environments/samples/3.x/EnvironmentsSample/.vscode/launch.json" range="4-10,32-38"::: - -The `.vscode/launch.json` file is only used by Visual Studio Code. - -### Production - -The production environment should be configured to maximize security, [performance](xref:performance/overview), and application robustness. Some common settings that differ from development include: - -* [Caching](xref:performance/caching/memory). -* Client-side resources are bundled, minified, and potentially served from a CDN. -* Diagnostic error pages disabled. -* Friendly error pages enabled. -* Production [logging](xref:fundamentals/logging/index) and monitoring enabled. For example, using [Application Insights](/azure/application-insights/app-insights-asp-net-core). - -## Set the environment - -It's often useful to set a specific environment for testing with an environment variable or platform setting. If the environment isn't set, it defaults to `Production`, which disables most debugging features. The method for setting the environment depends on the operating system. - -When the host is built, the last environment setting read by the app determines the app's environment. The app's environment can't be changed while the app is running. - -The [About page](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/3.x/EnvironmentsSample/Pages/About.cshtml) from the [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/3.x) displays the value of `IWebHostEnvironment.EnvironmentName`. - -### Azure App Service - - is the default value if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` have not been set. Apps deployed to azure are `Production` by default. - -To set the environment in [Azure App Service](https://azure.microsoft.com/services/app-service/), perform the following steps: - -1. Select the app from the **App Services** blade. -1. In the **Settings** group, select the **Configuration** blade. -1. In the **Application settings** tab, select **New application setting**. -1. In the **Add/Edit application setting** window, provide `ASPNETCORE_ENVIRONMENT` for the **Name**. For **Value**, provide the environment (for example, `Staging`). -1. Select the **Deployment slot setting** checkbox if you wish the environment setting to remain with the current slot when deployment slots are swapped. For more information, see [Set up staging environments in Azure App Service](/azure/app-service/web-sites-staged-publishing) in the Azure documentation. -1. Select **OK** to close the **Add/Edit application setting** window. -1. Select **Save** at the top of the **Configuration** blade. +Call when building the host. See . -Azure App Service automatically restarts the app after an app setting is added, changed, or deleted in the Azure portal. +:::moniker-end -### Windows +## Configuration by environment -Environment values in `launchSettings.json` override values set in the system environment. +To load configuration by environment, see . -To set the `ASPNETCORE_ENVIRONMENT` for the current session when the app is started using [dotnet run](/dotnet/core/tools/dotnet-run), the following commands are used: +## Configure services and middleware by environment -**Command prompt** +Use or to conditionally add services or middleware depending on the current environment. The following `Program` file example only processes requests with Exception Handling and HSTA Middlewares when the current environment isn't Development: -```console -set ASPNETCORE_ENVIRONMENT=Staging -dotnet run --no-launch-profile +```csharp +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + app.UseHsts(); +} ``` -**PowerShell** +The highlighted code checks the current environment while building the request pipeline. To check the current environment while configuring services, use `builder.Environment` instead of `app.Environment`. -```powershell -$Env:ASPNETCORE_ENVIRONMENT = "Staging" -dotnet run --no-launch-profile +## Environment-based `Startup` class and methods + +Use of a `Startup` class (`Startup.cs`) with [`Configure`](xref:Microsoft.AspNetCore.Hosting.StartupBase.Configure%2A) and [`ConfigureServices`](xref:Microsoft.AspNetCore.Hosting.StartupBase.ConfigureServices%2A) methods is no longer recommended for apps that target .NET 6 or later. Modern ASP.NET Core project templates place startup code for service configuration and request pipeline processing in the `Program` file. However, use of a `Startup` class remains supported in ASP.NET Core, and you can use the guidance in this section to control code execution by environment using a `Startup` class. + +### Inject `IWebHostEnvironment` into the `Startup` class + +Inject into the `Startup` constructor to control code execution. This approach is useful when the app requires configuring startup code for only a few environments with minimal code differences per environment. + +In the following example, the environment is held in the `_env` field and controls code execution based on the app's environment: + +```csharp +public class Startup +{ + private readonly IWebHostEnvironment _env; + + public Startup(IWebHostEnvironment env) + { + _env = env; + } + + public void ConfigureServices(IServiceCollection services) + { + if (_env.IsDevelopment()) + { + ... + } + else if (_env.IsStaging()) + { + ... + } + else + { + ... + } + } + + public void Configure(IApplicationBuilder app) + { + if (_env.IsDevelopment()) + { + ... + } + else + { + ... + } + + ... + } +} ``` -The preceding command sets `ASPNETCORE_ENVIRONMENT` only for processes launched from that command window. - -To set the value globally in Windows, use either of the following approaches: - -* Open the **Control Panel** > **System** > **Advanced system settings** and add or edit the `ASPNETCORE_ENVIRONMENT` value: - - :::image source="environments/_static/systemsetting_environment.png" alt-text="System Advanced Properties"::: - - :::image source="environments/_static/windows_aspnetcore_environment.png" alt-text="ASPNET Core Environment Variable"::: - -* Open an administrative command prompt and use the `setx` command or open an administrative PowerShell command prompt and use `[Environment]::SetEnvironmentVariable`: - - **Command prompt** - - ```console - setx ASPNETCORE_ENVIRONMENT Staging /M - ``` - - The `/M` switch indicates to set the environment variable at the system level. If the `/M` switch isn't used, the environment variable is set for the user account. - - **PowerShell** - - ```powershell - [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "Machine") - ``` - - The `Machine` option value indicates to set the environment variable at the system level. If the option value is changed to `User`, the environment variable is set for the user account. - -When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for `dotnet run` in any command window opened after the value is set. Environment values in `launchSettings.json` override values set in the system environment. - -**web.config** - -To set the `ASPNETCORE_ENVIRONMENT` environment variable with `web.config`, see the *Set environment variables* section of . - -**Project file or publish profile** - -**For Windows IIS deployments:** Include the `` property in the [publish profile (.pubxml)](xref:host-and-deploy/visual-studio-publish-profiles) or project file. This approach sets the environment in *web.config* when the project is published: - -```xml - - Development - +The preceding example is simplified with the use of [primary constructors](/dotnet/csharp/whats-new/tutorials/primary-constructors) in C# 12 (.NET 8) or later: + +```csharp +public class Startup(IWebHostEnvironment env) +{ + public void ConfigureServices(IServiceCollection services) + { + if (env.IsDevelopment()) + { + ... + } + else if (env.IsStaging()) + { + ... + } + else + { + ... + } + } + + public void Configure(IApplicationBuilder app) + { + if (env.IsDevelopment()) + { + ... + } + else + { + ... + } + + ... + } +} ``` -**Per IIS Application Pool** +### `Startup` class conventions -To set the `ASPNETCORE_ENVIRONMENT` environment variable for an app running in an isolated Application Pool (supported on IIS 10.0 or later), see the *AppCmd.exe command* section of the [Environment Variables <environmentVariables>](/iis/configuration/system.applicationHost/applicationPools/add/environmentVariables/#appcmdexe) topic. When the `ASPNETCORE_ENVIRONMENT` environment variable is set for an app pool, its value overrides a setting at the system level. +An app can define multiple `Startup` classes for different environments with the naming convention `Startup{EnvironmentName}` class, where the `{ENVIRONMENT NAME}` placeholder is the environment name. -When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` environment variable, use any one of the following approaches to have the new value picked up by apps: +The class whose name suffix matches the current environment is prioritized. If a matching `Startup{EnvironmentName}` class isn't found, the `Startup` class is used. This approach is useful when the app requires configuring startup for several environments with many code differences per environment. Typical apps don't have enough startup code differences across environments to use this approach. -* Execute `net stop was /y` followed by `net start w3svc` from a command prompt. -* Restart the server. +To implement environment-based `Startup` classes, create as many `Startup{EnvironmentName}` classes and a fallback `Startup` class: -#### macOS +```csharp +public class StartupDevelopment +{ + ... +} -Setting the current environment for macOS can be performed in-line when running the app: +public class StartupProduction +{ + ... +} -```bash -ASPNETCORE_ENVIRONMENT=Staging dotnet run +public class Startup +{ + ... +} ``` -Alternatively, set the environment with `export` prior to running the app: - -```bash -export ASPNETCORE_ENVIRONMENT=Staging -``` +Where the host builder is created, call , which accepts an assembly name to load the correct `Startup` class: -Machine-level environment variables are set in the *.bashrc* or *.bash_profile* file. Edit the file using any text editor. Add the following statement: +```csharp +public static IHostBuilder CreateHostBuilder(string[] args) +{ + var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName; -```bash -export ASPNETCORE_ENVIRONMENT=Staging + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(assemblyName); + }); +} ``` -#### Linux - -For Linux distributions, use the `export` command at a command prompt for session-based variable settings and *bash_profile* file for machine-level environment settings. +### `Startup` class method conventions -### Set the environment in code +The `Configure` and `ConfigureServices` methods support environment-specific versions of the form `Configure{ENVIRONMENT NAME}` and `Configure{ENVIRONMENT NAME}Services`, where the `{ENVIRONMENT NAME}` placeholder is the environment name. If a matching environment name isn't found for the named methods, the `ConfigureServices` or `Configure` method is used, respectively. This approach is useful when the app requires configuring startup for several environments with many code differences per environment: -Call when building the host. See . - -### Configuration by environment - -To load configuration by environment, see . +```csharp +public void ConfigureDevelopmentServices(IServiceCollection services) +{ + ... +} -## Environment-based Startup class and methods +public void ConfigureStagingServices(IServiceCollection services) +{ + ... +} -### Inject IWebHostEnvironment into the Startup class +public void ConfigureProductionServices(IServiceCollection services) +{ + ... +} -Inject into the `Startup` constructor. This approach is useful when the app requires configuring `Startup` for only a few environments with minimal code differences per environment. - -In the following example: - -* The environment is held in the `_env` field. -* `_env` is used in `ConfigureServices` and `Configure` to apply startup configuration based on the app's environment. - -:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/StartupInject.cs" id="snippet" highlight="3-11"::: - -### Startup class conventions - -When an ASP.NET Core app starts, the [Startup class](xref:fundamentals/startup) bootstraps the app. The app can define multiple `Startup` classes for different environments. The appropriate `Startup` class is selected at runtime. The class whose name suffix matches the current environment is prioritized. If a matching `Startup{EnvironmentName}` class isn't found, the `Startup` class is used. This approach is useful when the app requires configuring startup for several environments with many code differences per environment. Typical apps will not need this approach. - -To implement environment-based `Startup` classes, create a `Startup{EnvironmentName}` classes and a fallback `Startup` class: - -:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/StartupClassConventions.cs" id="snippet"::: - -Use the overload that accepts an assembly name: - -:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/Program.cs" id="snippet"::: - -### Startup method conventions - -[Configure](xref:Microsoft.AspNetCore.Hosting.StartupBase.Configure%2A) and [ConfigureServices](xref:Microsoft.AspNetCore.Hosting.StartupBase.ConfigureServices%2A) support environment-specific versions of the form `Configure` and `ConfigureServices`. If a matching `ConfigureServices` or `Configure` method isn't found, the `ConfigureServices` or `Configure` method is used, respectively. This approach is useful when the app requires configuring startup for several environments with many code differences per environment: - -:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/StartupMethodConventions.cs" id="snippet"::: +public void ConfigureServices(IServiceCollection services) +{ + ... +} +``` ## Additional resources @@ -597,5 +514,3 @@ Use the * * - -:::moniker-end diff --git a/aspnetcore/fundamentals/environments/_static/project-properties-debug.png b/aspnetcore/fundamentals/environments/_static/project-properties-debug.png deleted file mode 100644 index c61088cf02681a0adef01c9d4e08722abd891429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35867 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 Wy}_t|U|5;`9!%RnE90b9!2baB&b$o( From ffe2de74a23230b5726b7b993da7230c616d1994 Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Wed, 27 Aug 2025 16:31:12 -0400 Subject: [PATCH 02/10] Updates --- aspnetcore/fundamentals/environments.md | 140 ++++++++++++------------ 1 file changed, 73 insertions(+), 67 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 6ba69174ec9f..963fd1d0ef1d 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -16,14 +16,14 @@ ASP.NET Core configures app behavior based on the runtime environment using an e For Blazor environments guidance, which adds to or supersedes the guidance in this article, see . -## Environments +## How the runtime environment is determined :::moniker range=">= aspnetcore-7.0" To determine the runtime environment, ASP.NET Core reads from the following environment variables: 1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) -1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when `WebApplicationBuilder` is used. For other hosts, such as `ConfigureWebHostDefaults` and `WebHost.CreateDefaultBuilder`, `ASPNETCORE_ENVIRONMENT` has higher precedence. +1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when `WebApplicationBuilder` is used. For other hosts, such as and , `ASPNETCORE_ENVIRONMENT` has higher precedence. :::moniker-end @@ -45,64 +45,94 @@ To determine the runtime environment, ASP.NET Core reads from the following envi :::moniker-end -`IHostEnvironment.EnvironmentName` can be set to any value, but the following values are provided by the framework: +The provides general information about the app's hosting environment, and the , which can be set to any value, indicates the app's current environment. The following environment values are provided by the framework: -* : The [launchSettings.json](#development-and-launchsettingsjson) file sets `ASPNETCORE_ENVIRONMENT` to `Development` on the local machine. +* : The [`launchSettings.json`](#development-and-launchsettingsjson) file sets `ASPNETCORE_ENVIRONMENT` to `Development` on the local machine. * -* : The default if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` have not been set. +* : The default if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` haven't been set. -The following code: +The Production environment is configured to maximize security, performance, and app reliability. Some common settings that differ from the Development environment include: -* Is similar to the code generated by the ASP.NET Core templates. -* Enables the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) when `ASPNETCORE_ENVIRONMENT` is set to `Development`. This is done automatically by the method. -* Calls when the value of `ASPNETCORE_ENVIRONMENT` is anything other than `Development`. -* Provides an instance in the property of `WebApplication`. +* [Caching](xref:performance/caching/memory) is enabled. +* Client-side resources are bundled, minified, and potentially served from a CDN. +* Diagnostic error pages are disabled. +* Friendly error pages are enabled. +* Production logging and monitoring are enabled. For example, logging is enabled for [Azure Application Insights](/azure/application-insights/app-insights-asp-net-core). -:::code language="csharp" source="environments/samples/6.x/EnvironmentsSample/Program.cs" id="First"::: +## Control code execution during request processing -XXXXXXXXXXXXXX The 3.x version for less than 6.0 ...... +:::moniker range=">= aspnetcore-6.0" -The following code: +Use or to conditionally add services or middleware depending on the current environment. -* Calls when `ASPNETCORE_ENVIRONMENT` is set to `Development`. -* Calls when the value of `ASPNETCORE_ENVIRONMENT` is set to `Staging`, `Production`, or `Staging_2`. -* Injects into `Startup.Configure`. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. -* Is similar to the code generated by the ASP.NET Core templates. +When the value of `ASPNETCORE_ENVIRONMENT` is anything other than `Development`, the following code in the app's `Program` file: -:::code language="csharp" source="environments/samples/3.x/EnvironmentsSample/Startup.cs" id="snippet"::: +* Calls , which adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the pipeline to handle exceptions. +* Calls , which adds [HSTS Middleware](xref:security/enforcing-ssl#http-strict-transport-security-protocol-hsts) to apply the `Strict-Transport-Security` header. -XXXXXXXXXXXXXXX +```csharp +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + app.UseHsts(); +} +``` -The [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of [IHostEnvironment.EnvironmentName](xref:Microsoft.Extensions.Hosting.IHostEnvironment.EnvironmentName) to include or exclude markup in the element: +The preceding example checks the current environment while building the request pipeline. To check the current environment while configuring services, use `builder.Environment` instead of `app.Environment`. -:::code language="cshtml" source="environments/samples/6.x/EnvironmentsSample/Pages/About.cshtml" id="snippet_Environment"::: +:::moniker-end -:::code language="cshtml" source="environments/samples/3.x/EnvironmentsSample/Pages/About.cshtml" id="snippet_Environment"::: +:::moniker range="< aspnetcore-6.0" -The [About page](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x/EnvironmentsSample/Pages/About.cshtml) from the [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x) includes the preceding markup and displays the value of `IWebHostEnvironment.EnvironmentName`. +Use or to conditionally add services or middleware depending on the current environment. -On Windows and macOS, environment variables and values aren't case-sensitive. Linux environment variables and values are case-sensitive by default. +The following code in `Startup.Configure`: -### Create EnvironmentsSample +* Injects into `Startup.Configure`. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. +* Calls , which captures exceptions and generates HTML error responses, when `ASPNETCORE_ENVIRONMENT` is set to `Development`. +* Calls , which adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the pipeline to handle exceptions, when the value of `ASPNETCORE_ENVIRONMENT` is set to `Production`, `Staging`, or `Testing`. -The [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x) used in this article is based on a Razor Pages project named *EnvironmentsSample*. +```csharp +public void Configure(IApplicationBuilder app, IWebHostEnvironment env) +{ + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } -The following .NET CLI commands create and run a web app named *EnvironmentsSample*: + if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Testing")) + { + app.UseExceptionHandler("/Error"); + } -```dotnetcli -dotnet new webapp -o EnvironmentsSample -cd EnvironmentsSample -dotnet run --verbosity normal + ... +} ``` -When the app runs, it displays output similar to the following: +The preceding example checks the current environment while building the request pipeline. To check the current environment in `Startup.ConfigureServices` while configuring services, inject into the `Startup` class instead of injecting it into `Startup.Configure` and use the injected service to determine the environment in `Startup.ConfigureServices` and `Startup.Configure`. -```dotnetcli -info: Microsoft.Hosting.Lifetime[0] - Hosting environment: Development +:::moniker-end + +In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of to include or exclude markup in the Tag Helper's element: + +```cshtml + +
Environment is Development
+
+ +
Environment isn't Development
+
+ +
Environment is any of: Staging, Development, or Testing
+
``` -### Set environment on the command line +> [!IMPORTANT] +> On Windows and macOS, environment variables and values aren't case-sensitive. +> +> Linux environment variables and values are case-sensitive by default. + +## Set the environment on the command line (`dotnet run`) Use the `--environment` flag to set the environment. For example: @@ -117,9 +147,9 @@ info: Microsoft.Hosting.Lifetime[0] Hosting environment: Production ``` -### Development and launchSettings.json +## Set the environment with the launch settings file (`launchSettings.json`) -The development environment can enable features that shouldn't be exposed in production. For example, the ASP.NET Core project templates enable the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) in the development environment. Because of the performance cost, scope validation and dependency validation only happens in development. +The Development environment can enable features that shouldn't be exposed in production. For example, the ASP.NET Core project templates enable the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) in the Development environment. Because of the performance cost, scope validation and dependency validation only happens in development. The environment for local machine development can be set in the *Properties\launchSettings.json* file of the project. Environment values set in `launchSettings.json` override values set in the system environment. @@ -189,29 +219,17 @@ When using [Visual Studio Code](https://code.visualstudio.com/), environment var The `.vscode/launch.json` file is used only by Visual Studio Code. -### Production - -The production environment should be configured to maximize security, [performance](xref:performance/overview), and application robustness. Some common settings that differ from development include: - -* [Caching](xref:performance/caching/memory). -* Client-side resources are bundled, minified, and potentially served from a CDN. -* Diagnostic error pages disabled. -* Friendly error pages enabled. -* Production [logging](xref:fundamentals/logging/index) and monitoring enabled. For example, using [Application Insights](/azure/application-insights/app-insights-asp-net-core). - -## Set the environment by setting an environment variable +## Set the environment with an environment variable It's often useful to set a specific environment for testing with an environment variable or platform setting. If the environment isn't set, it defaults to `Production`, which disables most debugging features. The method for setting the environment depends on the operating system. When the host is built, the last environment setting read by the app determines the app's environment. The app's environment can't be changed while the app is running. -The [About page](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x/EnvironmentsSample/Pages/About.cshtml) from the [sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples/6.x) displays the value of `IWebHostEnvironment.EnvironmentName`. - ### Azure App Service - is the default value if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` have not been set. Apps deployed to Azure are `Production` by default. + is the default value if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` haven't been set. Apps deployed to Azure adopt the `Production` environment by default. -To set the environment in an [Azure App Service](https://azure.microsoft.com/services/app-service/) app by using the portal: +To set the environment in an [Azure App Service](https://azure.microsoft.com/services/app-service/) app using the Azure portal: 1. Select the app from the **App Services** page. 1. In the **Settings** group, select **Environment variables**. @@ -221,7 +239,7 @@ To set the environment in an [Azure App Service](https://azure.microsoft.com/ser 1. Select **OK** to close the **Add/Edit application setting** dialog. 1. Select **Save** at the top of the **Configuration** page. -Azure App Service automatically restarts the app after an app setting is added, changed, or deleted in the Azure portal. +Azure App Service automatically restarts the app after an app setting is added, changed, or deleted. ### Windows: Set environment variable for a process @@ -314,7 +332,7 @@ export ASPNETCORE_ENVIRONMENT=Staging For Linux distributions, use the `export` command at a command prompt for session-based variable settings and the `bash_profile` file for machine-level environment settings. -## Set the environment in code +## Set the environment in startup code :::moniker range=">= aspnetcore-6.0" @@ -339,19 +357,7 @@ Call . -## Configure services and middleware by environment - -Use or to conditionally add services or middleware depending on the current environment. The following `Program` file example only processes requests with Exception Handling and HSTA Middlewares when the current environment isn't Development: - -```csharp -if (!app.Environment.IsDevelopment()) -{ - app.UseExceptionHandler("/Error"); - app.UseHsts(); -} -``` -The highlighted code checks the current environment while building the request pipeline. To check the current environment while configuring services, use `builder.Environment` instead of `app.Environment`. ## Environment-based `Startup` class and methods From 73b86f046444b677169b134ad6fe8ce4c665448c Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Thu, 28 Aug 2025 11:55:32 -0400 Subject: [PATCH 03/10] Updates --- aspnetcore/fundamentals/environments.md | 271 ++++++++++-------- .../environments/_static/iisx2.png | Bin 22663 -> 0 bytes 2 files changed, 157 insertions(+), 114 deletions(-) delete mode 100644 aspnetcore/fundamentals/environments/_static/iisx2.png diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 963fd1d0ef1d..6d8760261021 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -5,17 +5,52 @@ description: Learn how to control app behavior across multiple environments in A monikerRange: '>= aspnetcore-3.1' ms.author: tdykstra ms.custom: mvc -ms.date: 08/26/2025 +ms.date: 08/28/2025 uid: fundamentals/environments --- # Control app behavior across multiple environments in ASP.NET Core apps [!INCLUDE[](~/includes/not-latest-version.md)] -ASP.NET Core configures app behavior based on the runtime environment using an environment variable. +ASP.NET Core configures app behavior based on the runtime *environment*, which usually reflects where the app is running. The environment is used by the .NET framework, tooling, and developer code. + +An organization app's usually run in the *Development* environment locally on developer's machines with one set of configured behaviors and in the *Production* environment when deployed to a server with a different set of configured behaviors. + +This article describes app runtime environments, how to set the environment, and how the environment controls app behavior. For Blazor environments guidance, which adds to or supersedes the guidance in this article, see . +## Environment values + +Although the environment can be any string value, the following environment values are provided by the framework and are typically used by ASP.NET Core apps: + +* +* +* + +The Production environment is configured to maximize security, performance, and app reliability. Some common settings that differ from the Development environment include: + +* [Caching](xref:performance/caching/memory) is enabled. +* Client-side resources are bundled, minified, and potentially served from a CDN. +* Diagnostic error pages are disabled. +* Friendly error pages are enabled. +* Production logging and monitoring are enabled. For example, logging is enabled for [Azure Application Insights](/azure/application-insights/app-insights-asp-net-core). + +The last environment setting read by the app determines the app's environment. The app's environment can't be changed while the app is running. + +On Windows and macOS, environment variables and values aren't case-sensitive. Linux environment variables and values are case-sensitive by default. + +## How the runtime environment is indicated + +Output in the command shell of a running app at startup indicates the app's environment. In the following example, the app is running in the Staging environment: + +```dotnetcli +info: Microsoft.Hosting.Lifetime[0] + Hosting environment: Staging +``` + +Within the app, the provides general information about the app's hosting environment, and the property indicates the app's current environment. + ## How the runtime environment is determined :::moniker range=">= aspnetcore-7.0" @@ -45,19 +80,7 @@ To determine the runtime environment, ASP.NET Core reads from the following envi :::moniker-end -The provides general information about the app's hosting environment, and the , which can be set to any value, indicates the app's current environment. The following environment values are provided by the framework: - -* : The [`launchSettings.json`](#development-and-launchsettingsjson) file sets `ASPNETCORE_ENVIRONMENT` to `Development` on the local machine. -* -* : The default if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` haven't been set. - -The Production environment is configured to maximize security, performance, and app reliability. Some common settings that differ from the Development environment include: - -* [Caching](xref:performance/caching/memory) is enabled. -* Client-side resources are bundled, minified, and potentially served from a CDN. -* Diagnostic error pages are disabled. -* Friendly error pages are enabled. -* Production logging and monitoring are enabled. For example, logging is enabled for [Azure Application Insights](/azure/application-insights/app-insights-asp-net-core). +The Production environment is the default environment if the `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` environment variables aren't set. ## Control code execution during request processing @@ -113,75 +136,55 @@ The preceding example checks the current environment while building the request :::moniker-end +## Control rendered content in Razor Pages pages and MVC views + In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of to include or exclude markup in the Tag Helper's element: ```cshtml -
Environment is Development
+
The environment is Development.
-
Environment isn't Development
+
The environment isn't Development.
-
Environment is any of: Staging, Development, or Testing
+
The environment is any of: Staging, Development, or Testing.
``` -> [!IMPORTANT] -> On Windows and macOS, environment variables and values aren't case-sensitive. -> -> Linux environment variables and values are case-sensitive by default. - -## Set the environment on the command line (`dotnet run`) +## Set the environment in a command shell when the app is run (`dotnet run`) -Use the `--environment` flag to set the environment. For example: +Use the `-e|--environment` flag to set the environment: ```dotnetcli -dotnet run --environment Production -``` - -The preceding command sets the environment to `Production` and displays output similar to the following in the command window: - -```dotnetcli -info: Microsoft.Hosting.Lifetime[0] - Hosting environment: Production +dotnet run -e Staging ``` ## Set the environment with the launch settings file (`launchSettings.json`) -The Development environment can enable features that shouldn't be exposed in production. For example, the ASP.NET Core project templates enable the [Developer Exception Page](xref:fundamentals/error-handling#developer-exception-page) in the Development environment. Because of the performance cost, scope validation and dependency validation only happens in development. - -The environment for local machine development can be set in the *Properties\launchSettings.json* file of the project. Environment values set in `launchSettings.json` override values set in the system environment. +The environment for local development can be set in the `Properties\launchSettings.json` file of the project. Environment values set in `launchSettings.json` override values set by the system environment. The `launchSettings.json` file: * Is only used on the local development machine. -* Is not deployed. -* Contains profile settings. - -The following JSON shows the `launchSettings.json` file for an ASP.NET Core web project named *EnvironmentsSample* created with Visual Studio or `dotnet new`: - -:::code language="json" source="environments/samples/6.x/EnvironmentsSample/Properties/launchSettingsCopy.json"::: - -:::code language="json" source="environments/samples/3.x/EnvironmentsSample/Properties/launchSettingsCopy.json"::: - -The preceding JSON contains two profiles: +* Isn't deployed when the app is published. +* May contain multiple profiles, each configuring a different environment. -* `EnvironmentsSample`: The profile name is the project name. As the first profile listed, this profile is used by default. The `"commandName"` key has the value `"Project"`, therefore, the [Kestrel web server](xref:fundamentals/servers/kestrel) is launched. +The following example sets the Staging environment for the `https` launch profile using the `ASPNETCORE_ENVIRONMENT` environment variable: -* `IIS Express`: The `"commandName"` key has the value `"IISExpress"`, therefore, [IISExpress](/iis/extensions/introduction-to-iis-express/iis-express-overview) is the web server. - -You can set the launch profile to the project or any other profile included in `launchSettings.json`. For example, in the image below, selecting the project name launches the [Kestrel web server](xref:fundamentals/servers/kestrel). - -:::image source="environments/_static/iisx2.png" alt-text="IIS Express launch on menu"::: - -The value of `commandName` can specify the web server to launch. `commandName` can be any one of the following: - -* `IISExpress` : Launches IIS Express. -* `IIS` : No web server launched. IIS is expected to be available. -* `Project` : Launches Kestrel. +```json +"https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7205", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Staging" + } +} +``` -In Visual Studio, there are two approaches for setting the environment via the launch profiles: +In Visual Studio, there are two approaches for setting the environment via launch profiles: * Press Alt+Enter or select **Properties** after right-clicking the project in **Solution Explorer**. Select **Debug** > **General**, and select the **Open debug launch profiles UI** link. @@ -189,47 +192,36 @@ In Visual Studio, there are two approaches for setting the environment via the l The preceding approaches open the **Launch Profiles** dialog where you can edit the environment variable settings in the `launchSettings.json` file. Changes made to project profiles may not take effect until the web server is restarted. Kestrel must be restarted before it can detect changes made to its environment. -Inspect the launch profiles directly (and edit the environment variable directly) in the `Properties/launchSettings.json` file: - -```json -"environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" -} -``` - Profiles can be selected in the Visual Studio UI next to the Start button (►). -* Using the [`dotnet run`](/dotnet/core/tools/dotnet-run) command with the [`-lp|--launch-profile` option](/dotnet/core/tools/dotnet-run#options) set to the profile's name. *This approach only supports Kestrel profiles.* - - ```dotnetcli - dotnet run -lp "EnvironmentsSample" - ``` +Alternatively, use the [`dotnet run`](/dotnet/core/tools/dotnet-run) command with the [`-lp|--launch-profile` option](/dotnet/core/tools/dotnet-run#options) set to the profile's name. *This approach only supports Kestrel profiles.* -> [!WARNING] -> `launchSettings.json` shouldn't store secrets. The [Secret Manager tool](xref:security/app-secrets) can be used to store secrets for local development. +```dotnetcli +dotnet run -lp "https" +``` -When using [Visual Studio Code](https://code.visualstudio.com/), environment variables can be set in the `.vscode/launch.json` file. The following example sets several [environment variables for Host configuration values](xref:fundamentals/host/web-host#host-configuration-values): +When using [Visual Studio Code](https://code.visualstudio.com/), set the `ASPNETCORE_ENVIRONMENT` environment variable in the `.vscode/launch.json` in the `env` section, along with other environment variables set in the section: ```json "env": { - "ASPNETCORE_ENVIRONMENT": "Development", + "ASPNETCORE_ENVIRONMENT": "Staging", ... }, ``` The `.vscode/launch.json` file is used only by Visual Studio Code. -## Set the environment with an environment variable +When Visual Studio or Visual Studio Code aren't used as the development environment, edit the `Properties\launchSettings.json` file and change one or more `ASPNETCORE_ENVIRONMENT` environment variable values. -It's often useful to set a specific environment for testing with an environment variable or platform setting. If the environment isn't set, it defaults to `Production`, which disables most debugging features. The method for setting the environment depends on the operating system. +## Set the environment with an environment variable -When the host is built, the last environment setting read by the app determines the app's environment. The app's environment can't be changed while the app is running. +It's often useful to set a specific environment for testing with an environment variable or platform setting. If the environment isn't set, it defaults to the Production environment, which disables most debugging features. The method for setting the environment depends on the operating system. ### Azure App Service - is the default value if `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` haven't been set. Apps deployed to Azure adopt the `Production` environment by default. +Apps deployed to [Azure App Service](https://azure.microsoft.com/services/app-service/) adopt the `Production` environment by default. -To set the environment in an [Azure App Service](https://azure.microsoft.com/services/app-service/) app using the Azure portal: +To set the environment using the Azure portal: 1. Select the app from the **App Services** page. 1. In the **Settings** group, select **Environment variables**. @@ -241,27 +233,34 @@ To set the environment in an [Azure App Service](https://azure.microsoft.com/ser Azure App Service automatically restarts the app after an app setting is added, changed, or deleted. -### Windows: Set environment variable for a process +### Windows -Environment values in `launchSettings.json` override values set in the system environment. +Set the app's environment using any of the approaches in this section. -To set the `ASPNETCORE_ENVIRONMENT` for the current session when the app is started using [dotnet run](/dotnet/core/tools/dotnet-run), use the following commands at a command prompt or in PowerShell: +#### Set environment variable for a process -```console +To set the `ASPNETCORE_ENVIRONMENT` environment variable for the current session (command shell) when the app is started using [`dotnet run`](/dotnet/core/tools/dotnet-run), use the following commands. First, the environment variable is set. Then, the app is started without a launch profile using the [`--no-launch-profile`](/dotnet/core/tools/dotnet-run#options) option. + +Command shell: The following commands are shown separately because not all command shells execute multiple commands when pasted at once. + +```dotnetcli set ASPNETCORE_ENVIRONMENT=Staging +``` + +```dotnetcli dotnet run --no-launch-profile ``` +PowerShell: PowerShell is capable of executing multiple commands at once when pasted together. + ```powershell $Env:ASPNETCORE_ENVIRONMENT = "Staging" dotnet run --no-launch-profile ``` -### Windows: Set environment variable globally - -The preceding commands set `ASPNETCORE_ENVIRONMENT` only for processes launched from that command window. +#### Set environment variable globally -To set the value globally in Windows, use either of the following approaches: +To set the environment variable globally in Windows, use either of the following approaches: * Open the **Control Panel** > **System** > **Advanced system settings** and add or edit the `ASPNETCORE_ENVIRONMENT` value: @@ -283,56 +282,102 @@ To set the value globally in Windows, use either of the following approaches: The `Machine` option sets the environment variable at the system level. If the option value is changed to `User`, the environment variable is set for the user account. -When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for `dotnet run` in any command window opened after the value is set. Environment values in `launchSettings.json` override values set in the system environment. +When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for the [`dotnet run`](/dotnet/core/tools/dotnet-run) command in any command shell opened after the value is set. Environment values set by launch profiles in the `launchSettings.json` file override values set for the system environment. -### Windows: IIS +#### Set the environment for apps deployed to IIS -#### Set the environment variable in the `web.config` file +To set the `ASPNETCORE_ENVIRONMENT` environment variable with the `web.config` file, see the *Set environment variables* section of . -To set the `ASPNETCORE_ENVIRONMENT` environment variable with `web.config`, see the *Set environment variables* section of . - -#### Set the environment variable on deployment to IIS - -Include the `` property in the [publish profile (.pubxml)](xref:host-and-deploy/visual-studio-publish-profiles) or project file. This approach sets the environment in `web.config` when the project is published: +To set the environment variable on deployment to IIS, include the `` property in the [publish profile (.pubxml)](xref:host-and-deploy/visual-studio-publish-profiles) or project file. The following example sets the environment in `web.config` to the Staging environment when the project is published: ```xml - Development + Staging ``` To set the `ASPNETCORE_ENVIRONMENT` environment variable for an app running in an isolated Application Pool (supported on IIS 10.0 or later), see the *AppCmd.exe command* section of [Environment Variables <environmentVariables>](/iis/configuration/system.applicationHost/applicationPools/add/environmentVariables/#appcmdexe). When the `ASPNETCORE_ENVIRONMENT` environment variable is set for an app pool, its value overrides a setting at the system level. -When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` environment variable, use one of the following approaches to have the new value picked up by apps: +When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` environment variable, use one of the following approaches to have the new value take effect for running apps: -* Execute `net stop was /y` followed by `net start w3svc` from a command prompt. +* Execute `net stop was /y` followed by `net start w3svc` in a command shell. * Restart the server. -### macOS +### macOS and Linux -Setting the current environment for macOS can be performed in-line when running the app: +Setting the current environment for macOS can be performed in-line when running the app in the Terminal shell: ```dotnetcli ASPNETCORE_ENVIRONMENT=Staging dotnet run ``` -Alternatively, set the environment with `export` prior to running the app: +Alternatively, set the environment with the [`export`](https://man7.org/linux/man-pages/man1/export.1p.html) command prior to running the app: ```dotnetcli export ASPNETCORE_ENVIRONMENT=Staging ``` -Machine-level environment variables are set in the *.bashrc* or *.bash_profile* file. Edit the file using any text editor. Add the following statement: +Environment variables set with `export` only exist for the lifetime of the current shell. To persist the setting across multiple sessions or system reboots, add the `export` command to a shell startup file (`.bashrc` or `.bash_profile`). + +### Docker + +Set the app's environment using any of the approaches in this section. + +#### Use a Dockerfile + +Set the `ASPNETCORE_ENVIRONMENT` environment variable within the Dockerfile using the `ENV` instruction: -```dotnetcli -export ASPNETCORE_ENVIRONMENT=Staging ``` +ENV ASPNETCORE_ENVIRONMENT=Staging +``` + +#### Use Docker Compose -### Linux +For multi-service apps managed with Docker Compose, define `ASPNETCORE_ENVIRONMENT` environment variables within the `docker-compose.yml` file: + +``` +version: "3.9" +services: + web: + build: . + ports: + - "8000:5000" + environment: + - ASPNETCORE_ENVIRONMENT=Staging + - API_KEY=... +``` + +An environment set at runtime with Docker Compose overrides an environment set by the Dockerfile. + +#### Use the `docker run` command + +When running the Docker container with the `docker run` command, Set the `ASPNETCORE_ENVIRONMENT` environment variable with the `-e|--env` option: + +```console +docker run -e ASPNETCORE_ENVIRONMENT=Staging aspnet_core_image +``` -For Linux distributions, use the `export` command at a command prompt for session-based variable settings and the `bash_profile` file for machine-level environment settings. +An environment set at runtime with `docker run` overrides an environment set by the Dockerfile. -## Set the environment in startup code +#### Docker environment file + +Set the `ASPNETCORE_ENVIRONMENT` environment variable using a Docker environment file (`.env`). + +`env_variables.env`: + +``` +ASPNETCORE_ENVIRONMENT=Staging +``` + +Load the file with the `--env-file` option when executing the `docker run` command: + +```shell +docker run --env-file ./env_variables.env aspnet_core_image +``` + +An environment set at runtime with `docker run` overrides an environment set by the Dockerfile. + +## Set the environment in the app's startup code :::moniker range=">= aspnetcore-6.0" @@ -349,16 +394,14 @@ var builder = WebApplication.CreateBuilder(new WebApplicationOptions :::moniker range="< aspnetcore-6.0" -Call when building the host. See . +Call when building the host. For more information, see . :::moniker-end -## Configuration by environment +## Load configuration by environment To load configuration by environment, see . - - ## Environment-based `Startup` class and methods Use of a `Startup` class (`Startup.cs`) with [`Configure`](xref:Microsoft.AspNetCore.Hosting.StartupBase.Configure%2A) and [`ConfigureServices`](xref:Microsoft.AspNetCore.Hosting.StartupBase.ConfigureServices%2A) methods is no longer recommended for apps that target .NET 6 or later. Modern ASP.NET Core project templates place startup code for service configuration and request pipeline processing in the `Program` file. However, use of a `Startup` class remains supported in ASP.NET Core, and you can use the guidance in this section to control code execution by environment using a `Startup` class. @@ -516,7 +559,7 @@ public void ConfigureServices(IServiceCollection services) ## Additional resources -* [View or download sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/environments/samples) ([how to download](xref:index#how-to-download-a-sample)) +* [View or download sample code](https://github.com/dotnet/AspNetCore.Docs.Samples/tree/main/fundamentals/environments) ([how to download](xref:index#how-to-download-a-sample)) * * * diff --git a/aspnetcore/fundamentals/environments/_static/iisx2.png b/aspnetcore/fundamentals/environments/_static/iisx2.png deleted file mode 100644 index 3976905901ef49fc46f8eab25f59d0e35a03bd60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22663 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 Date: Fri, 29 Aug 2025 11:40:57 -0400 Subject: [PATCH 04/10] Updates --- aspnetcore/fundamentals/environments.md | 36 ++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 6d8760261021..73c5a98a31ed 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -1,28 +1,28 @@ --- -title: Control app behavior across multiple environments in ASP.NET Core apps +title: ASP.NET Core runtime environments author: tdykstra -description: Learn how to control app behavior across multiple environments in ASP.NET Core apps. +description: Learn how to set and control app behavior across runtime environments in ASP.NET Core apps. monikerRange: '>= aspnetcore-3.1' ms.author: tdykstra ms.custom: mvc -ms.date: 08/28/2025 +ms.date: 08/29/2025 uid: fundamentals/environments --- -# Control app behavior across multiple environments in ASP.NET Core apps +# ASP.NET Core runtime environments [!INCLUDE[](~/includes/not-latest-version.md)] -ASP.NET Core configures app behavior based on the runtime *environment*, which usually reflects where the app is running. The environment is used by the .NET framework, tooling, and developer code. +ASP.NET Core configures app behavior based on the runtime *environment*, which usually reflects where the app is running. The app's code execution is tailored to the environment in which the app is running. -An organization app's usually run in the *Development* environment locally on developer's machines with one set of configured behaviors and in the *Production* environment when deployed to a server with a different set of configured behaviors. +App's usually run in the *Development* environment during local development and testing on a developer's machine with one set of configured behaviors and in the *Production* environment when deployed to a server with a different set of configured behaviors. Any number of additional environments can be used, such as the *Staging* environment provided by the framework for staging an app prior to live deployment or other environments that developers create. -This article describes app runtime environments, how to set the environment, and how the environment controls app behavior. +This article describes app runtime environments, how to set the environment, and how to use the environment to control app behavior. For Blazor environments guidance, which adds to or supersedes the guidance in this article, see . -## Environment values +## Environments -Although the environment can be any string value, the following environment values are provided by the framework and are typically used by ASP.NET Core apps: +Although the environment can be any string value, the following environment values are provided by the framework: * * @@ -40,7 +40,7 @@ The last environment setting read by the app determines the app's environment. T On Windows and macOS, environment variables and values aren't case-sensitive. Linux environment variables and values are case-sensitive by default. -## How the runtime environment is indicated +## Logging Output in the command shell of a running app at startup indicates the app's environment. In the following example, the app is running in the Staging environment: @@ -49,9 +49,7 @@ info: Microsoft.Hosting.Lifetime[0] Hosting environment: Staging ``` -Within the app, the provides general information about the app's hosting environment, and the property indicates the app's current environment. - -## How the runtime environment is determined +## Environment variables that determine the runtime environment :::moniker range=">= aspnetcore-7.0" @@ -66,7 +64,7 @@ To determine the runtime environment, ASP.NET Core reads from the following envi To determine the runtime environment, ASP.NET Core reads from the following environment variables: -1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) +1. [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) 1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. :::moniker-end @@ -75,14 +73,14 @@ To determine the runtime environment, ASP.NET Core reads from the following envi To determine the runtime environment, ASP.NET Core reads from the following environment variables: -1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) +1. [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) 1. `ASPNETCORE_ENVIRONMENT` when is called. The default ASP.NET Core web app templates call `ConfigureWebHostDefaults`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. :::moniker-end -The Production environment is the default environment if the `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` environment variables aren't set. +If the `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` environment variables aren't set, the Production environment is the default environment. -## Control code execution during request processing +## Control code execution by environment :::moniker range=">= aspnetcore-6.0" @@ -136,7 +134,9 @@ The preceding example checks the current environment while building the request :::moniker-end -## Control rendered content in Razor Pages pages and MVC views +Within the app, the provides general information about the app's hosting environment, and the property indicates the app's current environment. + +## Control rendered content in Razor Pages and MVC In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of to include or exclude markup in the Tag Helper's element: From e5611e6c0603ac672a80c4f8c67631f6faf8f879 Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Wed, 3 Sep 2025 10:47:51 -0400 Subject: [PATCH 05/10] Updates --- aspnetcore/fundamentals/environments.md | 131 +++++++++++++----------- 1 file changed, 73 insertions(+), 58 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 73c5a98a31ed..9aa235e22385 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -5,18 +5,18 @@ description: Learn how to set and control app behavior across runtime environmen monikerRange: '>= aspnetcore-3.1' ms.author: tdykstra ms.custom: mvc -ms.date: 08/29/2025 +ms.date: 09/03/2025 uid: fundamentals/environments --- # ASP.NET Core runtime environments [!INCLUDE[](~/includes/not-latest-version.md)] -ASP.NET Core configures app behavior based on the runtime *environment*, which usually reflects where the app is running. The app's code execution is tailored to the environment in which the app is running. +ASP.NET Core configures app behavior based on the runtime *environment*, which usually reflects where the app is running. App's usually run in the *Development* environment during local development and testing on a developer's machine with one set of configured behaviors and in the *Production* environment when deployed to a server with a different set of configured behaviors. Any number of additional environments can be used, such as the *Staging* environment provided by the framework for staging an app prior to live deployment or other environments that developers create. -This article describes app runtime environments, how to set the environment, and how to use the environment to control app behavior. +This article describes app runtime environments, how to use the environment to control app behavior, how to set the environment. For Blazor environments guidance, which adds to or supersedes the guidance in this article, see . @@ -38,8 +38,6 @@ The Production environment is configured to maximize security, performance, and The last environment setting read by the app determines the app's environment. The app's environment can't be changed while the app is running. -On Windows and macOS, environment variables and values aren't case-sensitive. Linux environment variables and values are case-sensitive by default. - ## Logging Output in the command shell of a running app at startup indicates the app's environment. In the following example, the app is running in the Staging environment: @@ -51,45 +49,44 @@ info: Microsoft.Hosting.Lifetime[0] ## Environment variables that determine the runtime environment -:::moniker range=">= aspnetcore-7.0" - To determine the runtime environment, ASP.NET Core reads from the following environment variables: -1. [DOTNET_ENVIRONMENT](xref:fundamentals/configuration/index#default-host-configuration) -1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when `WebApplicationBuilder` is used. For other hosts, such as and , `ASPNETCORE_ENVIRONMENT` has higher precedence. +:::moniker range=">= aspnetcore-7.0" + +* [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) +* `ASPNETCORE_ENVIRONMENT` when the method is called. The ASP.NET Core web app project templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when is used. For other hosts, such as and , `ASPNETCORE_ENVIRONMENT` has higher precedence. :::moniker-end :::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0" -To determine the runtime environment, ASP.NET Core reads from the following environment variables: - -1. [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) -1. `ASPNETCORE_ENVIRONMENT` when the method is called. The default ASP.NET Core web app templates call `WebApplication.CreateBuilder`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. +* [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) +* `ASPNETCORE_ENVIRONMENT` when the method is called. The ASP.NET Core web app project templates call `WebApplication.CreateBuilder`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. :::moniker-end :::moniker range="< aspnetcore-6.0" -To determine the runtime environment, ASP.NET Core reads from the following environment variables: - -1. [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) -1. `ASPNETCORE_ENVIRONMENT` when is called. The default ASP.NET Core web app templates call `ConfigureWebHostDefaults`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. +* [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) +* `ASPNETCORE_ENVIRONMENT` when is called. The ASP.NET Core web app project templates call `ConfigureWebHostDefaults`. The `ASPNETCORE_ENVIRONMENT` value overrides `DOTNET_ENVIRONMENT`. :::moniker-end If the `DOTNET_ENVIRONMENT` and `ASPNETCORE_ENVIRONMENT` environment variables aren't set, the Production environment is the default environment. +On Windows and macOS, environment variable names aren't case-sensitive. Linux environment variables are case-sensitive. + ## Control code execution by environment :::moniker range=">= aspnetcore-6.0" Use or to conditionally add services or middleware depending on the current environment. -When the value of `ASPNETCORE_ENVIRONMENT` is anything other than `Development`, the following code in the app's `Program` file: +The following code in the app's `Program` file: -* Calls , which adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the pipeline to handle exceptions. -* Calls , which adds [HSTS Middleware](xref:security/enforcing-ssl#http-strict-transport-security-protocol-hsts) to apply the `Strict-Transport-Security` header. +* Uses to distinguish the environment, specifically when the value of `ASPNETCORE_ENVIRONMENT` is anything other than `Development`. This approach is useful when the app only requires adjusting the `Program` file for a few environments with minimal code differences per environment. When many code differences exist per environment, consider using one of the [environment-based `Startup` class approaches](#environment-based-startup-class-and-methods), which is covered later in this article. +* Calls , which adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the request processing pipeline to handle exceptions. +* Calls , which adds [HSTS Middleware](xref:security/enforcing-ssl#http-strict-transport-security-protocol-hsts) to apply the [`Strict-Transport-Security` header](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security). ```csharp if (!app.Environment.IsDevelopment()) @@ -99,7 +96,7 @@ if (!app.Environment.IsDevelopment()) } ``` -The preceding example checks the current environment while building the request pipeline. To check the current environment while configuring services, use `builder.Environment` instead of `app.Environment`. +The preceding example checks the current environment for the request processing pipeline. To check the current environment while configuring services, use [`builder.Environment`](xref:Microsoft.AspNetCore.Builder.WebApplicationBuilder.Environment%2A) instead of [`app.Environment`](xref:Microsoft.AspNetCore.Builder.WebApplication.Environment%2A). :::moniker-end @@ -109,9 +106,9 @@ Use or into `Startup.Configure`. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. -* Calls , which captures exceptions and generates HTML error responses, when `ASPNETCORE_ENVIRONMENT` is set to `Development`. -* Calls , which adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the pipeline to handle exceptions, when the value of `ASPNETCORE_ENVIRONMENT` is set to `Production`, `Staging`, or `Testing`. +* Injects into `Startup.Configure` to tailor the code to the environment. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. When many code differences exist per environment, consider using one of the [environment-based `Startup` class approaches](#environment-based-startup-class-and-methods), which is covered later in this article. +* Calls when `ASPNETCORE_ENVIRONMENT` is set to `Development`. The call adds middleware that captures exceptions and generates HTML error responses. +* Calls when the value of `ASPNETCORE_ENVIRONMENT` is set to `Production`, `Staging`, or `Testing`. The call adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the pipeline to handle exceptions. ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) @@ -138,7 +135,7 @@ Within the app, the provide ## Control rendered content in Razor Pages and MVC -In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of to include or exclude markup in the Tag Helper's element: +In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of to include or exclude markup in the Tag Helper's `` element: ```cshtml @@ -154,7 +151,7 @@ In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-hel ## Set the environment in a command shell when the app is run (`dotnet run`) -Use the `-e|--environment` flag to set the environment: +Use the [`-e|--environment` option](/dotnet/core/tools/dotnet-run#options) to set the environment: ```dotnetcli dotnet run -e Staging @@ -186,21 +183,23 @@ The following example sets the Staging environment for the `https` launch profil In Visual Studio, there are two approaches for setting the environment via launch profiles: -* Press Alt+Enter or select **Properties** after right-clicking the project in **Solution Explorer**. Select **Debug** > **General**, and select the **Open debug launch profiles UI** link. +* Press Alt+Enter or select **Properties** after right-clicking the project in **Solution Explorer**. Select **Debug** > **General**, followed by selecting the **Open debug launch profiles UI** link. -* With the project selected in **Solution Explorer**, select **{PROJECT NAME} Debug Properties**, where the `{PROJECT NAME}` placeholder is a project name, from the **Debug** menu. +* With the project selected in **Solution Explorer**, select **{PROJECT NAME} Debug Properties** from the **Debug** menu, where the `{PROJECT NAME}` placeholder is a project name. The preceding approaches open the **Launch Profiles** dialog where you can edit the environment variable settings in the `launchSettings.json` file. Changes made to project profiles may not take effect until the web server is restarted. Kestrel must be restarted before it can detect changes made to its environment. Profiles can be selected in the Visual Studio UI next to the Start button (►). +When a solution contains multiple projects, only set the environment for the startup project. + Alternatively, use the [`dotnet run`](/dotnet/core/tools/dotnet-run) command with the [`-lp|--launch-profile` option](/dotnet/core/tools/dotnet-run#options) set to the profile's name. *This approach only supports Kestrel profiles.* ```dotnetcli dotnet run -lp "https" ``` -When using [Visual Studio Code](https://code.visualstudio.com/), set the `ASPNETCORE_ENVIRONMENT` environment variable in the `.vscode/launch.json` in the `env` section, along with other environment variables set in the section: +When using [Visual Studio Code](https://code.visualstudio.com/), set the `ASPNETCORE_ENVIRONMENT` environment variable in the `.vscode/launch.json` in the `env` section, along with any other environment variables set in the section: ```json "env": { @@ -209,9 +208,7 @@ When using [Visual Studio Code](https://code.visualstudio.com/), set the `ASPNET }, ``` -The `.vscode/launch.json` file is used only by Visual Studio Code. - -When Visual Studio or Visual Studio Code aren't used as the development environment, edit the `Properties\launchSettings.json` file and change one or more `ASPNETCORE_ENVIRONMENT` environment variable values. +The `.vscode/launch.json` file is only used by Visual Studio Code. ## Set the environment with an environment variable @@ -219,17 +216,12 @@ It's often useful to set a specific environment for testing with an environment ### Azure App Service -Apps deployed to [Azure App Service](https://azure.microsoft.com/services/app-service/) adopt the `Production` environment by default. +Apps deployed to [Azure App Service](https://azure.microsoft.com/services/app-service/) adopt the Production environment by default. -To set the environment using the Azure portal: +To set the `ASPNETCORE_ENVIRONMENT` environment variable, see the following resources in the Azure documentation: -1. Select the app from the **App Services** page. -1. In the **Settings** group, select **Environment variables**. -1. In the **App settings** tab, select **+ Add**. -1. In the **Add/Edit application setting** window, provide `ASPNETCORE_ENVIRONMENT` for the **Name**. For **Value**, provide the environment (for example, `Staging`). -1. Select the **Deployment slot setting** checkbox if you wish the environment setting to remain with the current slot when deployment slots are swapped. For more information, see [Set up staging environments in Azure App Service](/azure/app-service/web-sites-staged-publishing) in the Azure documentation. -1. Select **OK** to close the **Add/Edit application setting** dialog. -1. Select **Save** at the top of the **Configuration** page. +* [Configure an App Service app](/azure/app-service/configure-common?tabs=portal#configure-app-settings) +* [Set up staging environments in Azure App Service](/azure/app-service/web-sites-staged-publishing) Azure App Service automatically restarts the app after an app setting is added, changed, or deleted. @@ -239,9 +231,9 @@ Set the app's environment using any of the approaches in this section. #### Set environment variable for a process -To set the `ASPNETCORE_ENVIRONMENT` environment variable for the current session (command shell) when the app is started using [`dotnet run`](/dotnet/core/tools/dotnet-run), use the following commands. First, the environment variable is set. Then, the app is started without a launch profile using the [`--no-launch-profile`](/dotnet/core/tools/dotnet-run#options) option. +To set the `ASPNETCORE_ENVIRONMENT` environment variable for the current session (command shell) when the app is started using [`dotnet run`](/dotnet/core/tools/dotnet-run), use the following commands. First, the environment variable is set. Next, the app is started without a launch profile using the [`--no-launch-profile`](/dotnet/core/tools/dotnet-run#options) option. -Command shell: The following commands are shown separately because not all command shells execute multiple commands when pasted at once. +Command shell: The following commands are shown separately because not all command shells execute multiple commands when pasted at once. Use the [`set` command](/windows-server/administration/windows-commands/set) to set the environment variable: ```dotnetcli set ASPNETCORE_ENVIRONMENT=Staging @@ -251,7 +243,7 @@ set ASPNETCORE_ENVIRONMENT=Staging dotnet run --no-launch-profile ``` -PowerShell: PowerShell is capable of executing multiple commands at once when pasted together. +PowerShell: PowerShell is capable of executing multiple commands at once when pasted together at a command prompt. ```powershell $Env:ASPNETCORE_ENVIRONMENT = "Staging" @@ -260,7 +252,7 @@ dotnet run --no-launch-profile #### Set environment variable globally -To set the environment variable globally in Windows, use either of the following approaches: +To set the environment variable globally, use ***either*** of the following approaches: * Open the **Control Panel** > **System** > **Advanced system settings** and add or edit the `ASPNETCORE_ENVIRONMENT` value: @@ -268,25 +260,29 @@ To set the environment variable globally in Windows, use either of the following :::image source="environments/_static/windows_aspnetcore_environment.png" alt-text="ASPNET Core Environment Variable"::: -* Open an administrative command prompt and use the `setx` command or open an administrative PowerShell command prompt and use `[Environment]::SetEnvironmentVariable`: +* Set the `ASPNETCORE_ENVIRONMENT` environment variable at the system level using ***either*** of the following approaches: - * ```console + * Open an administrative command prompt and use the [`setx` command](/windows-server/administration/windows-commands/setx): + + ```console setx ASPNETCORE_ENVIRONMENT Staging /M ``` The `/M` switch sets the environment variable at the system level. If the `/M` switch isn't used, the environment variable is set for the user account. - * ```powershell + * Alternatively, open an administrative PowerShell command prompt and use the [`[Environment]::SetEnvironmentVariable` command](/powershell/module/microsoft.powershell.core/about/about_environment_variables#use-the-systemenvironment-methods): + + ```powershell [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "Machine") ``` The `Machine` option sets the environment variable at the system level. If the option value is changed to `User`, the environment variable is set for the user account. -When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for the [`dotnet run`](/dotnet/core/tools/dotnet-run) command in any command shell opened after the value is set. Environment values set by launch profiles in the `launchSettings.json` file override values set for the system environment. +When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for the [`dotnet run`](/dotnet/core/tools/dotnet-run) command in any command shell opened after the value is set. Environment values set by [launch profiles in the `launchSettings.json` file](#set-the-environment-with-the-launch-settings-file-launchsettingsjson) override values set for the system environment. #### Set the environment for apps deployed to IIS -To set the `ASPNETCORE_ENVIRONMENT` environment variable with the `web.config` file, see the *Set environment variables* section of . +To set the `ASPNETCORE_ENVIRONMENT` environment variable with the `web.config` file, see . To set the environment variable on deployment to IIS, include the `` property in the [publish profile (.pubxml)](xref:host-and-deploy/visual-studio-publish-profiles) or project file. The following example sets the environment in `web.config` to the Staging environment when the project is published: @@ -296,16 +292,16 @@ To set the environment variable on deployment to IIS, include the ` ``` -To set the `ASPNETCORE_ENVIRONMENT` environment variable for an app running in an isolated Application Pool (supported on IIS 10.0 or later), see the *AppCmd.exe command* section of [Environment Variables <environmentVariables>](/iis/configuration/system.applicationHost/applicationPools/add/environmentVariables/#appcmdexe). When the `ASPNETCORE_ENVIRONMENT` environment variable is set for an app pool, its value overrides a setting at the system level. +To set the `ASPNETCORE_ENVIRONMENT` environment variable for an app running in an isolated Application Pool (supported on IIS 10.0 or later), see [Environment Variables <environmentVariables>](/iis/configuration/system.applicationHost/applicationPools/add/environmentVariables/#appcmdexe). When the `ASPNETCORE_ENVIRONMENT` environment variable is set for an Application Pool, its value overrides a setting at the system level. -When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` environment variable, use one of the following approaches to have the new value take effect for running apps: +When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` environment variable, use ***either*** of the following approaches to have the new value take effect for running apps: * Execute `net stop was /y` followed by `net start w3svc` in a command shell. * Restart the server. ### macOS and Linux -Setting the current environment for macOS can be performed in-line when running the app in the Terminal shell: +Setting the current environment for macOS can be performed in-line when running the app in a Terminal shell: ```dotnetcli ASPNETCORE_ENVIRONMENT=Staging dotnet run @@ -351,7 +347,7 @@ An environment set at runtime with Docker Compose overrides an environment set b #### Use the `docker run` command -When running the Docker container with the `docker run` command, Set the `ASPNETCORE_ENVIRONMENT` environment variable with the `-e|--env` option: +When running the Docker container with the [`docker run` command](https://docs.docker.com/reference/cli/docker/container/run/), Set the `ASPNETCORE_ENVIRONMENT` environment variable with the `-e|--env` option: ```console docker run -e ASPNETCORE_ENVIRONMENT=Staging aspnet_core_image @@ -369,7 +365,7 @@ Set the `ASPNETCORE_ENVIRONMENT` environment variable using a Docker environment ASPNETCORE_ENVIRONMENT=Staging ``` -Load the file with the `--env-file` option when executing the `docker run` command: +Load the file with the `--env-file` option when executing the [`docker run` command](https://docs.docker.com/reference/cli/docker/container/run/): ```shell docker run --env-file ./env_variables.env aspnet_core_image @@ -404,7 +400,26 @@ To load configuration by environment, see method: + +```csharp +public class Program +{ + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); +} +``` ### Inject `IWebHostEnvironment` into the `Startup` class @@ -495,9 +510,9 @@ public class Startup(IWebHostEnvironment env) An app can define multiple `Startup` classes for different environments with the naming convention `Startup{EnvironmentName}` class, where the `{ENVIRONMENT NAME}` placeholder is the environment name. -The class whose name suffix matches the current environment is prioritized. If a matching `Startup{EnvironmentName}` class isn't found, the `Startup` class is used. This approach is useful when the app requires configuring startup for several environments with many code differences per environment. Typical apps don't have enough startup code differences across environments to use this approach. +The class whose name suffix matches the current environment is prioritized. If a matching `Startup{EnvironmentName}` class isn't found, the `Startup` class is used. This approach is useful when the app requires configuring startup for several environments with many code differences per environment. -To implement environment-based `Startup` classes, create as many `Startup{EnvironmentName}` classes and a fallback `Startup` class: +To implement environment-based `Startup` classes, create as many `Startup{EnvironmentName}` classes as needed and a fallback `Startup` class: ```csharp public class StartupDevelopment From 005cfe7db9fd501fd26b6d7af0ce4d2a7c84f725 Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Wed, 3 Sep 2025 11:07:04 -0400 Subject: [PATCH 06/10] Updates --- .../fundamentals/environments/_static/iisx.png | Bin 17826 -> 0 bytes .../environments/_static/launch-profiles.png | Bin 46599 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 aspnetcore/fundamentals/environments/_static/iisx.png delete mode 100644 aspnetcore/fundamentals/environments/_static/launch-profiles.png diff --git a/aspnetcore/fundamentals/environments/_static/iisx.png b/aspnetcore/fundamentals/environments/_static/iisx.png deleted file mode 100644 index b9b7d92dd59364d68bd854191cbdbca7e4397782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17826 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 diff --git a/aspnetcore/fundamentals/environments/_static/launch-profiles.png b/aspnetcore/fundamentals/environments/_static/launch-profiles.png deleted file mode 100644 index fb74ffd0c2080b8bbb18b0bc318d53ddfa320e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46599 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 From 91dbb17c027138ad5eb4609c501162abe571bbe4 Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Wed, 3 Sep 2025 11:30:32 -0400 Subject: [PATCH 07/10] Updates --- aspnetcore/fundamentals/environments.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 9aa235e22385..c633083d8c89 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -14,9 +14,9 @@ uid: fundamentals/environments ASP.NET Core configures app behavior based on the runtime *environment*, which usually reflects where the app is running. -App's usually run in the *Development* environment during local development and testing on a developer's machine with one set of configured behaviors and in the *Production* environment when deployed to a server with a different set of configured behaviors. Any number of additional environments can be used, such as the *Staging* environment provided by the framework for staging an app prior to live deployment or other environments that developers create. +Apps usually run in the *Development* environment during local development and testing on a developer's machine with one set of configured behaviors. In contrast, they run in the *Production* environment when deployed to a server with a different set of configured behaviors. Any number of additional environments can be used, such as the *Staging* environment provided by the framework for staging an app prior to live deployment or other environments that developers create. -This article describes app runtime environments, how to use the environment to control app behavior, how to set the environment. +This article describes app runtime environments, how to use the environment to control app behavior, and how to set the environment. For Blazor environments guidance, which adds to or supersedes the guidance in this article, see . @@ -231,9 +231,9 @@ Set the app's environment using any of the approaches in this section. #### Set environment variable for a process -To set the `ASPNETCORE_ENVIRONMENT` environment variable for the current session (command shell) when the app is started using [`dotnet run`](/dotnet/core/tools/dotnet-run), use the following commands. First, the environment variable is set. Next, the app is started without a launch profile using the [`--no-launch-profile`](/dotnet/core/tools/dotnet-run#options) option. +To set the `ASPNETCORE_ENVIRONMENT` environment variable for the current session (command shell) when the app is started using [`dotnet run`](/dotnet/core/tools/dotnet-run), use the following commands. After the environment variable is set, the app is started without a launch profile using the [`--no-launch-profile`](/dotnet/core/tools/dotnet-run#options) option. -Command shell: The following commands are shown separately because not all command shells execute multiple commands when pasted at once. Use the [`set` command](/windows-server/administration/windows-commands/set) to set the environment variable: +Command shell: ```dotnetcli set ASPNETCORE_ENVIRONMENT=Staging @@ -243,7 +243,7 @@ set ASPNETCORE_ENVIRONMENT=Staging dotnet run --no-launch-profile ``` -PowerShell: PowerShell is capable of executing multiple commands at once when pasted together at a command prompt. +PowerShell: ```powershell $Env:ASPNETCORE_ENVIRONMENT = "Staging" From 3664043857824a449d937505889c1649dc316f04 Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Tue, 16 Sep 2025 08:26:00 -0400 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: Daniel Roth --- aspnetcore/fundamentals/environments.md | 34 ++++++++----------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index c633083d8c89..5dd16acfb282 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -54,7 +54,9 @@ To determine the runtime environment, ASP.NET Core reads from the following envi :::moniker range=">= aspnetcore-7.0" * [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) -* `ASPNETCORE_ENVIRONMENT` when the method is called. The ASP.NET Core web app project templates call `WebApplication.CreateBuilder`. The `DOTNET_ENVIRONMENT` value overrides `ASPNETCORE_ENVIRONMENT` when is used. For other hosts, such as and , `ASPNETCORE_ENVIRONMENT` has higher precedence. +* `ASPNETCORE_ENVIRONMENT` + +When using , the `DOTNET_ENVIRONMENT` value take precedence over `ASPNETCORE_ENVIRONMENT`. When using , `ASPNETCORE_ENVIRONMENT` takes precedence. :::moniker-end @@ -84,7 +86,7 @@ Use to distinguish the environment, specifically when the value of `ASPNETCORE_ENVIRONMENT` is anything other than `Development`. This approach is useful when the app only requires adjusting the `Program` file for a few environments with minimal code differences per environment. When many code differences exist per environment, consider using one of the [environment-based `Startup` class approaches](#environment-based-startup-class-and-methods), which is covered later in this article. +* Uses to distinguish the environment. * Calls , which adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the request processing pipeline to handle exceptions. * Calls , which adds [HSTS Middleware](xref:security/enforcing-ssl#http-strict-transport-security-protocol-hsts) to apply the [`Strict-Transport-Security` header](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security). @@ -193,7 +195,7 @@ Profiles can be selected in the Visual Studio UI next to the Start button (►). When a solution contains multiple projects, only set the environment for the startup project. -Alternatively, use the [`dotnet run`](/dotnet/core/tools/dotnet-run) command with the [`-lp|--launch-profile` option](/dotnet/core/tools/dotnet-run#options) set to the profile's name. *This approach only supports Kestrel profiles.* +Alternatively, use the [`dotnet run`](/dotnet/core/tools/dotnet-run) command with the [`-lp|--launch-profile` option](/dotnet/core/tools/dotnet-run#options) set to the profile's name. *This approach only supports launch profiles based on the `Project` command.* ```dotnetcli dotnet run -lp "https" @@ -398,30 +400,14 @@ Call . -## Environment-based `Startup` class and methods +## Access the environment from a `Startup` class Since the release of .NET 6, the ASP.NET Core project templates place startup code for service configuration and request pipeline processing in the `Program` file. Use of a `Startup` class (`Startup.cs`) with [`Configure`](xref:Microsoft.AspNetCore.Hosting.StartupBase.Configure%2A) and [`ConfigureServices`](xref:Microsoft.AspNetCore.Hosting.StartupBase.ConfigureServices%2A) methods was required before the release of .NET 6 but remains supported in ASP.NET Core. You can use the guidance in this section to control code execution by environment using a `Startup` class in any release of ASP.NET Core when a large number of code changes are required for each environment in use by an app. -Except for the [`Startup` class conventions](#startup-class-conventions) approach, the `Program` class uses the following general approach to identify the `Startup` class, where the `Startup` class is the type for the method: -```csharp -public class Program -{ - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); -} ``` -### Inject `IWebHostEnvironment` into the `Startup` class Inject into the `Startup` constructor to control code execution. This approach is useful when the app requires configuring startup code for only a few environments with minimal code differences per environment. @@ -506,11 +492,11 @@ public class Startup(IWebHostEnvironment env) } ``` -### `Startup` class conventions +## Environment-specific `Startup` class An app can define multiple `Startup` classes for different environments with the naming convention `Startup{EnvironmentName}` class, where the `{ENVIRONMENT NAME}` placeholder is the environment name. -The class whose name suffix matches the current environment is prioritized. If a matching `Startup{EnvironmentName}` class isn't found, the `Startup` class is used. This approach is useful when the app requires configuring startup for several environments with many code differences per environment. +The class whose name suffix matches the current environment is prioritized. If a matching `Startup{EnvironmentName}` class isn't found, the `Startup` class is used. To implement environment-based `Startup` classes, create as many `Startup{EnvironmentName}` classes as needed and a fallback `Startup` class: @@ -546,9 +532,9 @@ public static IHostBuilder CreateHostBuilder(string[] args) } ``` -### `Startup` class method conventions +## Environment-specific `Startup` class methods -The `Configure` and `ConfigureServices` methods support environment-specific versions of the form `Configure{ENVIRONMENT NAME}` and `Configure{ENVIRONMENT NAME}Services`, where the `{ENVIRONMENT NAME}` placeholder is the environment name. If a matching environment name isn't found for the named methods, the `ConfigureServices` or `Configure` method is used, respectively. This approach is useful when the app requires configuring startup for several environments with many code differences per environment: +The `Configure` and `ConfigureServices` methods support environment-specific versions of the form `Configure{ENVIRONMENT NAME}` and `Configure{ENVIRONMENT NAME}Services`, where the `{ENVIRONMENT NAME}` placeholder is the environment name. If a matching environment name isn't found for the named methods, the `ConfigureServices` or `Configure` method is used, respectively. ```csharp public void ConfigureDevelopmentServices(IServiceCollection services) From 9e297cfb34a46ed76dc49b30b620abc27494a87d Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:01:53 -0400 Subject: [PATCH 09/10] Updates --- aspnetcore/fundamentals/environments.md | 129 ++++-------------------- 1 file changed, 21 insertions(+), 108 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index 5dd16acfb282..a41bb3b47fe8 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -28,13 +28,12 @@ Although the environment can be any string value, the following environment valu * * -The Production environment is configured to maximize security, performance, and app reliability. Some common settings that differ from the Development environment include: +The Production environment is configured to maximize security, performance, and app reliability. Common developer settings and configuration that differ from the Development environment include: -* [Caching](xref:performance/caching/memory) is enabled. -* Client-side resources are bundled, minified, and potentially served from a CDN. -* Diagnostic error pages are disabled. -* Friendly error pages are enabled. -* Production logging and monitoring are enabled. For example, logging is enabled for [Azure Application Insights](/azure/application-insights/app-insights-asp-net-core). +* Enabling [caching](xref:performance/caching/memory). +* Bundling and minifying client-side resources, along with potentially serving them from a CDN. +* Disabling diagnostic error pages and enabling friendly error pages. +* Enabling production logging and monitoring. For example, logging is enabled for [Azure Application Insights](/azure/application-insights/app-insights-asp-net-core). The last environment setting read by the app determines the app's environment. The app's environment can't be changed while the app is running. @@ -56,7 +55,7 @@ To determine the runtime environment, ASP.NET Core reads from the following envi * [`DOTNET_ENVIRONMENT`](xref:fundamentals/configuration/index#default-host-configuration) * `ASPNETCORE_ENVIRONMENT` -When using , the `DOTNET_ENVIRONMENT` value take precedence over `ASPNETCORE_ENVIRONMENT`. When using , `ASPNETCORE_ENVIRONMENT` takes precedence. +When using , the `DOTNET_ENVIRONMENT` value take precedence over `ASPNETCORE_ENVIRONMENT`. When using , `ASPNETCORE_ENVIRONMENT` takes precedence. :::moniker-end @@ -108,7 +107,7 @@ Use or into `Startup.Configure` to tailor the code to the environment. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. When many code differences exist per environment, consider using one of the [environment-based `Startup` class approaches](#environment-based-startup-class-and-methods), which is covered later in this article. +* Injects into `Startup.Configure` to tailor the code to the environment. This approach is useful when the app only requires adjusting `Startup.Configure` for a few environments with minimal code differences per environment. When many code differences exist per environment, consider using [accessing the environment from a `Startup` class](#access-the-environment-from-a-startup-class), which is covered later in this article. * Calls when `ASPNETCORE_ENVIRONMENT` is set to `Development`. The call adds middleware that captures exceptions and generates HTML error responses. * Calls when the value of `ASPNETCORE_ENVIRONMENT` is set to `Production`, `Staging`, or `Testing`. The call adds [Exception Handler Middleware](xref:fundamentals/error-handling) to the pipeline to handle exceptions. @@ -201,7 +200,9 @@ Alternatively, use the [`dotnet run`](/dotnet/core/tools/dotnet-run) command wit dotnet run -lp "https" ``` -When using [Visual Studio Code](https://code.visualstudio.com/), set the `ASPNETCORE_ENVIRONMENT` environment variable in the `.vscode/launch.json` in the `env` section, along with any other environment variables set in the section: +When using [Visual Studio Code](https://code.visualstudio.com/) with the [C# Dev Kit for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) ([Getting Started with C# in VS Code](https://code.visualstudio.com/docs/csharp/get-started)), launch profiles are picked up from the app's `launchSettings.json` file. + +If the C# Dev Kit isn't used, set the `ASPNETCORE_ENVIRONMENT` environment variable in the `.vscode/launch.json` in the `env` section, along with any other environment variables set in the section: ```json "env": { @@ -227,62 +228,32 @@ To set the `ASPNETCORE_ENVIRONMENT` environment variable, see the following reso Azure App Service automatically restarts the app after an app setting is added, changed, or deleted. -### Windows - -Set the app's environment using any of the approaches in this section. - -#### Set environment variable for a process +### Set environment variable for a process To set the `ASPNETCORE_ENVIRONMENT` environment variable for the current session (command shell) when the app is started using [`dotnet run`](/dotnet/core/tools/dotnet-run), use the following commands. After the environment variable is set, the app is started without a launch profile using the [`--no-launch-profile`](/dotnet/core/tools/dotnet-run#options) option. -Command shell: +1. In the command shell, set the environment variable using the appropriate approach for your operating system. -```dotnetcli -set ASPNETCORE_ENVIRONMENT=Staging -``` +1. Execute the `dotnet run` command without using a launch profile: -```dotnetcli -dotnet run --no-launch-profile -``` + ```dotnetcli + dotnet run --no-launch-profile + ``` -PowerShell: +When using PowerShell, the preceding steps can be combined in the following two commands. The following example sets the Staging environment: ```powershell $Env:ASPNETCORE_ENVIRONMENT = "Staging" dotnet run --no-launch-profile ``` -#### Set environment variable globally - -To set the environment variable globally, use ***either*** of the following approaches: - -* Open the **Control Panel** > **System** > **Advanced system settings** and add or edit the `ASPNETCORE_ENVIRONMENT` value: - - :::image source="environments/_static/systemsetting_environment.png" alt-text="System Advanced Properties"::: - - :::image source="environments/_static/windows_aspnetcore_environment.png" alt-text="ASPNET Core Environment Variable"::: - -* Set the `ASPNETCORE_ENVIRONMENT` environment variable at the system level using ***either*** of the following approaches: - - * Open an administrative command prompt and use the [`setx` command](/windows-server/administration/windows-commands/setx): - - ```console - setx ASPNETCORE_ENVIRONMENT Staging /M - ``` - - The `/M` switch sets the environment variable at the system level. If the `/M` switch isn't used, the environment variable is set for the user account. +### Set environment variable globally - * Alternatively, open an administrative PowerShell command prompt and use the [`[Environment]::SetEnvironmentVariable` command](/powershell/module/microsoft.powershell.core/about/about_environment_variables#use-the-systemenvironment-methods): - - ```powershell - [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "Machine") - ``` - - The `Machine` option sets the environment variable at the system level. If the option value is changed to `User`, the environment variable is set for the user account. +Use the appropriate guidance for your operating system to set the `ASPNETCORE_ENVIRONMENT` environment variable. When the `ASPNETCORE_ENVIRONMENT` environment variable is set globally, it takes effect for the [`dotnet run`](/dotnet/core/tools/dotnet-run) command in any command shell opened after the value is set. Environment values set by [launch profiles in the `launchSettings.json` file](#set-the-environment-with-the-launch-settings-file-launchsettingsjson) override values set for the system environment. -#### Set the environment for apps deployed to IIS +### Set the environment for apps deployed to IIS To set the `ASPNETCORE_ENVIRONMENT` environment variable with the `web.config` file, see . @@ -301,22 +272,6 @@ When hosting an app in IIS and adding or changing the `ASPNETCORE_ENVIRONMENT` e * Execute `net stop was /y` followed by `net start w3svc` in a command shell. * Restart the server. -### macOS and Linux - -Setting the current environment for macOS can be performed in-line when running the app in a Terminal shell: - -```dotnetcli -ASPNETCORE_ENVIRONMENT=Staging dotnet run -``` - -Alternatively, set the environment with the [`export`](https://man7.org/linux/man-pages/man1/export.1p.html) command prior to running the app: - -```dotnetcli -export ASPNETCORE_ENVIRONMENT=Staging -``` - -Environment variables set with `export` only exist for the lifetime of the current shell. To persist the setting across multiple sessions or system reboots, add the `export` command to a shell startup file (`.bashrc` or `.bash_profile`). - ### Docker Set the app's environment using any of the approaches in this section. @@ -402,12 +357,7 @@ To load configuration by environment, see into the `Startup` constructor to control code execution. This approach is useful when the app requires configuring startup code for only a few environments with minimal code differences per environment. @@ -455,43 +405,6 @@ public class Startup } ``` -The preceding example is simplified with the use of [primary constructors](/dotnet/csharp/whats-new/tutorials/primary-constructors) in C# 12 (.NET 8) or later: - -```csharp -public class Startup(IWebHostEnvironment env) -{ - public void ConfigureServices(IServiceCollection services) - { - if (env.IsDevelopment()) - { - ... - } - else if (env.IsStaging()) - { - ... - } - else - { - ... - } - } - - public void Configure(IApplicationBuilder app) - { - if (env.IsDevelopment()) - { - ... - } - else - { - ... - } - - ... - } -} -``` - ## Environment-specific `Startup` class An app can define multiple `Startup` classes for different environments with the naming convention `Startup{EnvironmentName}` class, where the `{ENVIRONMENT NAME}` placeholder is the environment name. From c9cc16795e37e6bf5318f2513c028c360ff7a7c9 Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:28:28 -0400 Subject: [PATCH 10/10] Updates --- aspnetcore/fundamentals/environments.md | 31 ++++++++++++++++--------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/aspnetcore/fundamentals/environments.md b/aspnetcore/fundamentals/environments.md index a41bb3b47fe8..7d920d20b96e 100644 --- a/aspnetcore/fundamentals/environments.md +++ b/aspnetcore/fundamentals/environments.md @@ -5,7 +5,7 @@ description: Learn how to set and control app behavior across runtime environmen monikerRange: '>= aspnetcore-3.1' ms.author: tdykstra ms.custom: mvc -ms.date: 09/03/2025 +ms.date: 09/16/2025 uid: fundamentals/environments --- # ASP.NET Core runtime environments @@ -134,22 +134,31 @@ The preceding example checks the current environment while building the request Within the app, the provides general information about the app's hosting environment, and the property indicates the app's current environment. -## Control rendered content in Razor Pages and MVC +## Control rendered content -In Razor Pages and MVC apps, the [Environment Tag Helper](xref:mvc/views/tag-helpers/builtin-th/environment-tag-helper) uses the value of to include or exclude markup in the Tag Helper's `` element: +Inject into a server-rendered Razor component and use the service's extension methods and property to determine the environment for rendering content: -```cshtml - +```razor +@inject IHostEnvironment Env + +@if (Env.IsDevelopment()) +{

The environment is Development.
- - +} + +@if (!Env.IsDevelopment()) +{
The environment isn't Development.
-
- -
The environment is any of: Staging, Development, or Testing.
-
+} + +@if (Env.IsStaging() || Env.EnvironmentName == "Testing") +{ +
The environment is either Staging or Testing.
+} ``` +For Blazor Web Apps that require the environment to control client-side rendering, see . + ## Set the environment in a command shell when the app is run (`dotnet run`) Use the [`-e|--environment` option](/dotnet/core/tools/dotnet-run#options) to set the environment: