diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs index 788995b320..a42e5cbf48 100644 --- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs +++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs @@ -55,15 +55,6 @@ namespace Microsoft.AspNetCore.Hosting.Internal } }); - _builder.ConfigureServices((context, services) => - { - if (_hostingStartupWebHostBuilder != null) - { - var webhostContext = GetWebHostBuilderContext(context); - _hostingStartupWebHostBuilder.ConfigureServices(webhostContext, services); - } - }); - _builder.ConfigureServices((context, services) => { var webhostContext = GetWebHostBuilderContext(context); @@ -96,6 +87,9 @@ namespace Microsoft.AspNetCore.Hosting.Internal services.TryAddScoped(); services.TryAddSingleton(); + // IMPORTANT: This needs to run *before* direct calls on the builder (like UseStartup) + _hostingStartupWebHostBuilder?.ConfigureServices(webhostContext, services); + // Support UseStartup(assemblyName) if (!string.IsNullOrEmpty(webHostOptions.StartupAssembly)) { diff --git a/src/Hosting/Hosting/test/WebHostBuilderTests.cs b/src/Hosting/Hosting/test/WebHostBuilderTests.cs index 0c962c5848..4db65a21d9 100644 --- a/src/Hosting/Hosting/test/WebHostBuilderTests.cs +++ b/src/Hosting/Hosting/test/WebHostBuilderTests.cs @@ -1472,6 +1472,19 @@ namespace Microsoft.AspNetCore.Hosting var loggerProvider = new TestLoggerProvider(); builder.UseSetting("testhostingstartup", "0") .UseSetting("testhostingstartup_chain", builder.GetSetting("testhostingstartup_chain") + "0") + .ConfigureServices(services => + { + // This check is required because MVC still uses the + // IWebHostEnvironment instance before the container is baked +#pragma warning disable CS0618 // Type or member is obsolete + var heDescriptor = services.SingleOrDefault(s => s.ServiceType == typeof(IHostingEnvironment)); + Assert.NotNull(heDescriptor); + Assert.NotNull(heDescriptor.ImplementationInstance); +#pragma warning restore CS0618 // Type or member is obsolete + var wheDescriptor = services.SingleOrDefault(s => s.ServiceType == typeof(IWebHostEnvironment)); + Assert.NotNull(wheDescriptor); + Assert.NotNull(wheDescriptor.ImplementationInstance); + }) .ConfigureServices(services => services.AddSingleton()) .ConfigureServices(services => services.AddSingleton(loggerProvider.Sink)) .ConfigureLogging((_, lf) => lf.AddProvider(loggerProvider))