diff --git a/src/DefaultBuilder/src/ConfigureHostBuilder.cs b/src/DefaultBuilder/src/ConfigureHostBuilder.cs index fdf8b2d0bc00e19a1db0e94572a9185d9f06a8d0..87e24d8488946908533aef37de07cd8f475ecb12 100644 --- a/src/DefaultBuilder/src/ConfigureHostBuilder.cs +++ b/src/DefaultBuilder/src/ConfigureHostBuilder.cs @@ -62,6 +62,7 @@ namespace Microsoft.AspNetCore.Builder var previousApplicationName = _configuration[HostDefaults.ApplicationKey]; // Use the real content root so we can compare paths var previousContentRoot = _context.HostingEnvironment.ContentRootPath; + var previousContentRootConfig = _configuration[HostDefaults.ContentRootKey]; var previousEnvironment = _configuration[HostDefaults.EnvironmentKey]; // Run these immediately so that they are observable by the imperative code @@ -74,7 +75,8 @@ namespace Microsoft.AspNetCore.Builder throw new NotSupportedException($"The application name changed from \"{previousApplicationName}\" to \"{_configuration[HostDefaults.ApplicationKey]}\". Changing the host configuration using WebApplicationBuilder.Host is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead."); } - if (!string.Equals(previousContentRoot, HostingPathResolver.ResolvePath(_configuration[HostDefaults.ContentRootKey]), StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(previousContentRootConfig, _configuration[HostDefaults.ContentRootKey], StringComparison.OrdinalIgnoreCase) + && !string.Equals(previousContentRoot, HostingPathResolver.ResolvePath(_configuration[HostDefaults.ContentRootKey]), StringComparison.OrdinalIgnoreCase)) { throw new NotSupportedException($"The content root changed from \"{previousContentRoot}\" to \"{HostingPathResolver.ResolvePath(_configuration[HostDefaults.ContentRootKey])}\". Changing the host configuration using WebApplicationBuilder.Host is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead."); } diff --git a/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs b/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs index 0a2c482f53f04f97bfb53e8ad850b341b221628f..d0ed6a822ab15fe3bb00a6b93b766c00ac3bda54 100644 --- a/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs +++ b/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs @@ -39,7 +39,9 @@ namespace Microsoft.AspNetCore.Builder public IWebHostBuilder ConfigureAppConfiguration(Action<WebHostBuilderContext, IConfigurationBuilder> configureDelegate) { var previousContentRoot = _context.HostingEnvironment.ContentRootPath; + var previousContentRootConfig = _configuration[WebHostDefaults.ContentRootKey]; var previousWebRoot = _context.HostingEnvironment.WebRootPath; + var previousWebRootConfig = _configuration[WebHostDefaults.WebRootKey]; var previousApplication = _configuration[WebHostDefaults.ApplicationKey]; var previousEnvironment = _configuration[WebHostDefaults.EnvironmentKey]; var previousHostingStartupAssemblies = _configuration[WebHostDefaults.HostingStartupAssembliesKey]; @@ -48,7 +50,8 @@ namespace Microsoft.AspNetCore.Builder // Run these immediately so that they are observable by the imperative code configureDelegate(_context, _configuration); - if (!string.Equals(HostingPathResolver.ResolvePath(previousWebRoot, previousContentRoot), HostingPathResolver.ResolvePath(_configuration[WebHostDefaults.WebRootKey], previousContentRoot), StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(previousWebRootConfig, _configuration[WebHostDefaults.WebRootKey], StringComparison.OrdinalIgnoreCase) + && !string.Equals(HostingPathResolver.ResolvePath(previousWebRoot, previousContentRoot), HostingPathResolver.ResolvePath(_configuration[WebHostDefaults.WebRootKey], previousContentRoot), StringComparison.OrdinalIgnoreCase)) { // Diasllow changing the web root for consistency with other types. throw new NotSupportedException($"The web root changed from \"{HostingPathResolver.ResolvePath(previousWebRoot, previousContentRoot)}\" to \"{HostingPathResolver.ResolvePath(_configuration[WebHostDefaults.WebRootKey], previousContentRoot)}\". Changing the host configuration using WebApplicationBuilder.WebHost is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead."); @@ -58,7 +61,8 @@ namespace Microsoft.AspNetCore.Builder // Disallow changing any host configuration throw new NotSupportedException($"The application name changed from \"{previousApplication}\" to \"{_configuration[WebHostDefaults.ApplicationKey]}\". Changing the host configuration using WebApplicationBuilder.WebHost is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead."); } - else if (!string.Equals(previousContentRoot, HostingPathResolver.ResolvePath(_configuration[WebHostDefaults.ContentRootKey]), StringComparison.OrdinalIgnoreCase)) + else if (!string.Equals(previousContentRootConfig, _configuration[WebHostDefaults.ContentRootKey], StringComparison.OrdinalIgnoreCase) + && !string.Equals(previousContentRoot, HostingPathResolver.ResolvePath(_configuration[WebHostDefaults.ContentRootKey]), StringComparison.OrdinalIgnoreCase)) { // Disallow changing any host configuration throw new NotSupportedException($"The content root changed from \"{previousContentRoot}\" to \"{HostingPathResolver.ResolvePath(_configuration[WebHostDefaults.ContentRootKey])}\". Changing the host configuration using WebApplicationBuilder.WebHost is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead."); diff --git a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs index 8f724498dde73a1751abe241468ca8676ad8b837..d487d259493993aaa450d5e199f177ed9c73b34a 100644 --- a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs +++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs @@ -1686,6 +1686,36 @@ namespace Microsoft.AspNetCore.Tests Assert.Equal(string.Empty, responseBody); } + [Fact] + public void EmptyAppConfiguration() + { + var wwwroot = Path.Combine(AppContext.BaseDirectory, "wwwroot"); + bool createdDirectory = false; + if (!Directory.Exists(wwwroot)) + { + createdDirectory = true; + Directory.CreateDirectory(wwwroot); + } + + try + { + var builder = WebApplication.CreateBuilder(); + + builder.WebHost.ConfigureAppConfiguration((ctx, config) => { }); + + using var app = builder.Build(); + var hostEnv = app.Services.GetRequiredService<Hosting.IWebHostEnvironment>(); + Assert.Equal(wwwroot, hostEnv.WebRootPath); + } + finally + { + if (createdDirectory) + { + Directory.Delete(wwwroot); + } + } + } + [Fact] public void HostConfigurationNotAffectedByConfiguration() {