Skip to content

Commit d15eabd

Browse files
committed
fix multiple of same startup
1 parent e2a1342 commit d15eabd

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ public IWebHostBuilder UseStartup([DynamicallyAccessedMembers(StartupLinkerOptio
178178
if (_builder.Properties.TryGetValue(_startupConfigName, out var startupObject) &&
179179
object.ReferenceEquals(startupObject, startupType))
180180
{
181+
_builder.Properties.Remove(_startupConfigName);
181182
UseStartup(startupType, context, services);
182183
}
183184
});
@@ -205,6 +206,7 @@ void ConfigureStartup(HostBuilderContext context, IServiceCollection services)
205206
if (_builder.Properties.TryGetValue(_startupConfigName, out var startupObject) &&
206207
object.ReferenceEquals(startupObject, startupFactory))
207208
{
209+
_builder.Properties.Remove(_startupConfigName);
208210
var webHostBuilderContext = GetWebHostBuilderContext(context);
209211
var instance = startupFactory(webHostBuilderContext) ?? throw new InvalidOperationException("The specified factory returned null startup instance.");
210212
UseStartup(instance.GetType(), context, services, instance);
@@ -325,6 +327,7 @@ public IWebHostBuilder Configure(Action<IApplicationBuilder> configure)
325327
if (_builder.Properties.TryGetValue(_startupConfigName, out var startupObject) &&
326328
object.ReferenceEquals(startupObject, configure))
327329
{
330+
_builder.Properties.Remove(_startupConfigName);
328331
services.Configure<GenericWebHostServiceOptions>(options =>
329332
{
330333
options.ConfigureApplication = configure;
@@ -349,6 +352,7 @@ public IWebHostBuilder Configure(Action<WebHostBuilderContext, IApplicationBuild
349352
if (_builder.Properties.TryGetValue(_startupConfigName, out var startupObject) &&
350353
object.ReferenceEquals(startupObject, configure))
351354
{
355+
_builder.Properties.Remove(_startupConfigName);
352356
services.Configure<GenericWebHostServiceOptions>(options =>
353357
{
354358
var webhostBuilderContext = GetWebHostBuilderContext(context);

src/Hosting/Hosting/test/GenericWebHostBuilderTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,29 @@ public async Task MultipleConfigureWebHostCallsWithUseStartupLastWins()
153153
await AssertResponseContains(server.RequestDelegate, "SecondStartup");
154154
}
155155

156+
[Fact]
157+
public async Task MultipleConfigureWebHostCallsWithSameUseStartupOnlyRunsOne()
158+
{
159+
var server = new TestServer();
160+
161+
using var host = new HostBuilder()
162+
.ConfigureWebHost(webHostBuilder =>
163+
{
164+
webHostBuilder
165+
.UseServer(server)
166+
.UseStartup<FirstStartup>();
167+
})
168+
.ConfigureWebHost(webHostBuilder =>
169+
{
170+
webHostBuilder
171+
.UseStartup<FirstStartup>();
172+
})
173+
.Build();
174+
175+
await host.StartAsync();
176+
Assert.Single(host.Services.GetRequiredService<IEnumerable<FirstStartup>>());
177+
}
178+
156179
private async Task AssertResponseContains(RequestDelegate app, string expectedText)
157180
{
158181
var httpContext = new DefaultHttpContext();

0 commit comments

Comments
 (0)