diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs b/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs index 0af6943995..e3d5cfd6db 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs @@ -162,7 +162,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal var startupFilters = _applicationServices.GetService>(); var configure = Startup.ConfigureDelegate; - foreach (var filter in startupFilters) + foreach (var filter in startupFilters.Reverse()) { configure = filter.Configure(configure); } diff --git a/test/Microsoft.AspNetCore.Hosting.Tests/WebHostTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostTests.cs index bfe1c5cab3..0053351a0f 100644 --- a/test/Microsoft.AspNetCore.Hosting.Tests/WebHostTests.cs +++ b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostTests.cs @@ -250,6 +250,53 @@ namespace Microsoft.AspNetCore.Hosting Assert.NotNull(host.Services.GetRequiredService>()); } + [Fact] + public void ConfiguresStartupFiltersInCorrectOrder() + { + // Verify ordering + var configureOrder = 0; + var host = CreateBuilder() + .UseServer((IServerFactory)this) + .ConfigureServices(services => + { + services.AddTransient(serviceProvider => new TestFilter( + () => Assert.Equal(1, configureOrder++), + () => Assert.Equal(2, configureOrder++), + () => Assert.Equal(5, configureOrder++))); + services.AddTransient(serviceProvider => new TestFilter( + () => Assert.Equal(0, configureOrder++), + () => Assert.Equal(3, configureOrder++), + () => Assert.Equal(4, configureOrder++))); + }) + .Build(); + Assert.Equal(6, configureOrder); + } + + private class TestFilter : IStartupFilter + { + private readonly Action _verifyConfigureOrder; + private readonly Action _verifyBuildBeforeOrder; + private readonly Action _verifyBuildAfterOrder; + + public TestFilter(Action verifyConfigureOrder, Action verifyBuildBeforeOrder, Action verifyBuildAfterOrder) + { + _verifyConfigureOrder = verifyConfigureOrder; + _verifyBuildBeforeOrder = verifyBuildBeforeOrder; + _verifyBuildAfterOrder = verifyBuildAfterOrder; + } + + public Action Configure(Action next) + { + _verifyConfigureOrder(); + return builder => + { + _verifyBuildBeforeOrder(); + next(builder); + _verifyBuildAfterOrder(); + }; + } + } + [Fact] public void EnvDefaultsToProductionIfNoConfig() { diff --git a/test/Microsoft.AspNetCore.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/TestServerTests.cs index 81f3b62ba7..7ee7f9f740 100644 --- a/test/Microsoft.AspNetCore.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNetCore.TestHost.Tests/TestServerTests.cs @@ -275,7 +275,7 @@ namespace Microsoft.AspNetCore.TestHost { app.Run(context => { - Assert.NotNull(context.RequestServices); + Assert.Null(context.RequestServices); return context.Response.WriteAsync("Success"); }); })