diff --git a/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs b/src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Hosting/ConfigurationManagerConfigExtensions.cs index 9bc6d9d86..1afc3a4eb 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,41 @@ 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..1081a6467 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; @@ -28,31 +26,25 @@ internal HttpApplicationHost(IHost host) _current = this; } - public static HttpApplicationHostBuilder CreateBuilder() + public static HttpApplicationHostBuilder CreateBuilder() => CreateBuilder(new HostApplicationBuilderSettings()); + + internal static HttpApplicationHostBuilder CreateBuilder(HostApplicationBuilderSettings settings) { - var config = new ConfigurationManager(); + if (settings is null) + { + throw new ArgumentNullException(nameof(settings)); + } - config.AddConfigurationManager(); + settings.Configuration ??= new ConfigurationManager(); + settings.Configuration.AddConfigurationManager(); + settings.Configuration.UseHostingEnvironmentFallback(); - var builder = new HostApplicationBuilder(new HostApplicationBuilderSettings() - { - Configuration = config, - ApplicationName = HostingEnvironment.SiteName, - ContentRootPath = HostingEnvironment.ApplicationPhysicalPath, - EnvironmentName = HostingEnvironment.IsDevelopmentEnvironment || IsIISExpress() ? Environments.Development : Environments.Production - }); + 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)