From 7a88f1e5f88d12ab624a879d28e0dcd29d103ab4 Mon Sep 17 00:00:00 2001 From: Arthur Moore Date: Fri, 20 Feb 2026 16:28:33 -0500 Subject: [PATCH 1/6] Support HostApplicationBuildersSettings for framework application (#665) This updates HttpApplicationHost.CreateBuilder to more closely match HostApplicationBuilder's constructor. Supports setting any HostDefaults value via configuration or a HostApplicationBuildersSettings instance. This allows even more patterns used in modern ASP.NET Core applications to be available in ASP.NET Framework, including setting the application name and environment. --- .../ConfigurationManagerConfigExtensions.cs | 35 ++++++++++++++++++- .../Hosting/HttpApplicationHost.cs | 31 +++++++--------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs index 9bc6d9d86..055645d32 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs @@ -3,8 +3,11 @@ using System.Collections; using System.Configuration; +using System.Diagnostics; +using System.Web.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Memory; +using Microsoft.Extensions.Hosting; namespace Microsoft.AspNetCore.SystemWebAdapters.Hosting; @@ -39,6 +42,36 @@ public static IConfigurationBuilder AddConfigurationManager(this IConfigurationB return builder; } -} + public static IConfigurationManager UseHostingEnvironmentFallback(this IConfigurationManager configuration) + { + List>? optionList = null; + if (configuration[HostDefaults.ApplicationKey] is null) + { + optionList = new(); + optionList.Add(new KeyValuePair(HostDefaults.ApplicationKey, HostingEnvironment.SiteName)); + } + if (configuration[HostDefaults.EnvironmentKey] is null && (HostingEnvironment.IsDevelopmentEnvironment || IsIISExpress())) + { + optionList ??= new(); + optionList.Add(new KeyValuePair(HostDefaults.EnvironmentKey, Environments.Development)); + } + if (configuration[HostDefaults.ContentRootKey] is null) + { + optionList ??= new(); + optionList.Add(new KeyValuePair(HostDefaults.ContentRootKey, HostingEnvironment.ApplicationPhysicalPath)); + } + if (optionList is not null) + { + configuration.AddInMemoryCollection(optionList); + } + static bool IsIISExpress() + { + using var currentProcess = Process.GetCurrentProcess(); + return string.Equals(currentProcess.ProcessName, "iisexpress", StringComparison.Ordinal); + } + + return configuration; + } +} diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs index 8e6caa01e..964df5a73 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs @@ -1,8 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Diagnostics; -using System.Web.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -30,29 +28,26 @@ internal HttpApplicationHost(IHost host) public static HttpApplicationHostBuilder CreateBuilder() { - var config = new ConfigurationManager(); - - config.AddConfigurationManager(); + return CreateBuilder(new HostApplicationBuilderSettings()); + } - var builder = new HostApplicationBuilder(new HostApplicationBuilderSettings() + internal static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) + { + if (settings is null) { - Configuration = config, - ApplicationName = HostingEnvironment.SiteName, - ContentRootPath = HostingEnvironment.ApplicationPhysicalPath, - EnvironmentName = HostingEnvironment.IsDevelopmentEnvironment || IsIISExpress() ? Environments.Development : Environments.Production - }); + throw new ArgumentNullException(nameof(settings)); + } + + settings.Configuration ??= new ConfigurationManager(); + settings.Configuration.AddConfigurationManager(); + settings.Configuration.UseHostingEnvironmentFallback(); + + var builder = new HostApplicationBuilder(settings); builder.Services.AddSingleton(); builder.Services.AddConfigurationAccessor(); return new(builder); - - static bool IsIISExpress() - { - using var currentProcess = Process.GetCurrentProcess(); - - return string.Equals(currentProcess.ProcessName, "iisexpress", StringComparison.Ordinal); - } } public static void RegisterHost(Action configure) From 83b9ac8944e785be23ca7d63ab66743b25a75d17 Mon Sep 17 00:00:00 2001 From: Taylor Southwick Date: Thu, 26 Feb 2026 10:07:01 -0800 Subject: [PATCH 2/6] Update src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs --- .../Hosting/ConfigurationManagerConfigExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs index 055645d32..78aa76d79 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs @@ -65,6 +65,7 @@ public static IConfigurationManager UseHostingEnvironmentFallback(this IConfigur { configuration.AddInMemoryCollection(optionList); } + static bool IsIISExpress() { using var currentProcess = Process.GetCurrentProcess(); From 52c5e2046da5aabf83a7e2ba57e58474e8280b3b Mon Sep 17 00:00:00 2001 From: Taylor Southwick Date: Thu, 26 Feb 2026 10:10:07 -0800 Subject: [PATCH 3/6] Update src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs --- .../Hosting/HttpApplicationHost.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs index 964df5a73..3318a5e2e 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs @@ -31,7 +31,7 @@ public static HttpApplicationHostBuilder CreateBuilder() return CreateBuilder(new HostApplicationBuilderSettings()); } - internal static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) + public static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) { if (settings is null) { From bba1803e101d4db79cc52ca2026bea60c99d509f Mon Sep 17 00:00:00 2001 From: Taylor Southwick Date: Thu, 26 Feb 2026 10:11:14 -0800 Subject: [PATCH 4/6] Update src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs --- .../Hosting/HttpApplicationHost.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs index 3318a5e2e..964df5a73 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs @@ -31,7 +31,7 @@ public static HttpApplicationHostBuilder CreateBuilder() return CreateBuilder(new HostApplicationBuilderSettings()); } - public static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) + internal static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) { if (settings is null) { From c0a5e03acacc70a6a48366bac5ec682c0997d73f Mon Sep 17 00:00:00 2001 From: Taylor Southwick Date: Thu, 26 Feb 2026 10:12:12 -0800 Subject: [PATCH 5/6] Add fallback options for hosting environment configuration --- .../Hosting/ConfigurationManagerConfigExtensions.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs index 78aa76d79..1afc3a4eb 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs @@ -46,21 +46,25 @@ public static IConfigurationBuilder AddConfigurationManager(this IConfigurationB public static IConfigurationManager UseHostingEnvironmentFallback(this IConfigurationManager configuration) { List>? optionList = null; + if (configuration[HostDefaults.ApplicationKey] is null) { optionList = new(); optionList.Add(new KeyValuePair(HostDefaults.ApplicationKey, HostingEnvironment.SiteName)); } + if (configuration[HostDefaults.EnvironmentKey] is null && (HostingEnvironment.IsDevelopmentEnvironment || IsIISExpress())) { optionList ??= new(); optionList.Add(new KeyValuePair(HostDefaults.EnvironmentKey, Environments.Development)); } + if (configuration[HostDefaults.ContentRootKey] is null) { optionList ??= new(); optionList.Add(new KeyValuePair(HostDefaults.ContentRootKey, HostingEnvironment.ApplicationPhysicalPath)); } + if (optionList is not null) { configuration.AddInMemoryCollection(optionList); From 264a183aaa034fdec8de602d17aa290b2ce6986b Mon Sep 17 00:00:00 2001 From: Taylor Southwick Date: Thu, 26 Feb 2026 10:12:47 -0800 Subject: [PATCH 6/6] Refactor CreateBuilder method to use expression-bodied syntax --- .../Hosting/HttpApplicationHost.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs index 964df5a73..1081a6467 100644 --- a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs +++ b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/HttpApplicationHost.cs @@ -26,10 +26,7 @@ internal HttpApplicationHost(IHost host) _current = this; } - public static HttpApplicationHostBuilder CreateBuilder() - { - return CreateBuilder(new HostApplicationBuilderSettings()); - } + public static HttpApplicationHostBuilder CreateBuilder() => CreateBuilder(new HostApplicationBuilderSettings()); internal static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) {