File tree 4 files changed +49
-3
lines changed
test/testassets/TestStartupAssembly1
4 files changed +49
-3
lines changed Original file line number Diff line number Diff line change @@ -129,15 +129,23 @@ private void ExecuteHostingStartups()
129
129
}
130
130
131
131
var exceptions = new List < Exception > ( ) ;
132
+ var processed = new HashSet < Assembly > ( ) ;
133
+
132
134
_hostingStartupWebHostBuilder = new HostingStartupWebHostBuilder ( this ) ;
133
135
134
136
// Execute the hosting startup assemblies
135
- foreach ( var assemblyName in webHostOptions . GetFinalHostingStartupAssemblies ( ) . Distinct ( StringComparer . OrdinalIgnoreCase ) )
137
+ foreach ( var assemblyName in webHostOptions . GetFinalHostingStartupAssemblies ( ) )
136
138
{
137
139
try
138
140
{
139
141
var assembly = Assembly . Load ( new AssemblyName ( assemblyName ) ) ;
140
142
143
+ if ( ! processed . Add ( assembly ) )
144
+ {
145
+ // Already processed, skip it
146
+ continue ;
147
+ }
148
+
141
149
foreach ( var attribute in assembly . GetCustomAttributes < HostingStartupAttribute > ( ) )
142
150
{
143
151
var hostingStartup = ( IHostingStartup ) Activator . CreateInstance ( attribute . HostingStartupType ) ! ;
Original file line number Diff line number Diff line change @@ -229,14 +229,21 @@ private IServiceCollection BuildCommonServices(out AggregateException? hostingSt
229
229
if ( ! _options . PreventHostingStartup )
230
230
{
231
231
var exceptions = new List < Exception > ( ) ;
232
+ var processed = new HashSet < Assembly > ( ) ;
232
233
233
234
// Execute the hosting startup assemblies
234
- foreach ( var assemblyName in _options . GetFinalHostingStartupAssemblies ( ) . Distinct ( StringComparer . OrdinalIgnoreCase ) )
235
+ foreach ( var assemblyName in _options . GetFinalHostingStartupAssemblies ( ) )
235
236
{
236
237
try
237
238
{
238
239
var assembly = Assembly . Load ( new AssemblyName ( assemblyName ) ) ;
239
240
241
+ if ( ! processed . Add ( assembly ) )
242
+ {
243
+ // Already processed, skip it
244
+ continue ;
245
+ }
246
+
240
247
foreach ( var attribute in assembly . GetCustomAttributes < HostingStartupAttribute > ( ) )
241
248
{
242
249
var hostingStartup = ( IHostingStartup ) Activator . CreateInstance ( attribute . HostingStartupType ) ! ;
Original file line number Diff line number Diff line change @@ -903,6 +903,27 @@ public void Build_RunsHostingStartupAssembliesIfSpecified(IWebHostBuilder builde
903
903
using ( var host = builder . Build ( ) )
904
904
{
905
905
Assert . Equal ( "1" , builder . GetSetting ( "testhostingstartup1" ) ) ;
906
+ Assert . Equal ( "1" , builder . GetSetting ( "testhostingstartup1_calls" ) ) ;
907
+ }
908
+ }
909
+
910
+ [ Theory ]
911
+ [ MemberData ( nameof ( DefaultWebHostBuildersWithConfig ) ) ]
912
+ public void Build_RunsDeduplicatedHostingStartupAssembliesIfSpecified ( IWebHostBuilder builder )
913
+ {
914
+ var fullName = typeof ( TestStartupAssembly1 . TestHostingStartup1 ) . Assembly . FullName ;
915
+ var name = typeof ( TestStartupAssembly1 . TestHostingStartup1 ) . Assembly . GetName ( ) . Name ;
916
+
917
+ builder = builder
918
+ . CaptureStartupErrors ( false )
919
+ . UseSetting ( WebHostDefaults . HostingStartupAssembliesKey , fullName + ";" + name )
920
+ . Configure ( app => { } )
921
+ . UseServer ( new TestServer ( ) ) ;
922
+
923
+ using ( var host = builder . Build ( ) )
924
+ {
925
+ Assert . Equal ( "1" , builder . GetSetting ( "testhostingstartup1" ) ) ;
926
+ Assert . Equal ( "1" , builder . GetSetting ( "testhostingstartup1_calls" ) ) ;
906
927
}
907
928
}
908
929
Original file line number Diff line number Diff line change 1
- // Copyright (c) .NET Foundation. All rights reserved.
1
+ // Copyright (c) .NET Foundation. All rights reserved.
2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
+ using System . Globalization ;
4
5
using Microsoft . AspNetCore . Hosting ;
5
6
6
7
[ assembly: HostingStartup ( typeof ( TestStartupAssembly1 . TestHostingStartup1 ) ) ]
@@ -11,8 +12,17 @@ public class TestHostingStartup1 : IHostingStartup
11
12
{
12
13
public void Configure ( IWebHostBuilder builder )
13
14
{
15
+ var calls = builder . GetSetting ( "testhostingstartup1_calls" ) ;
16
+ var numCalls = 1 ;
17
+
18
+ if ( calls != null )
19
+ {
20
+ numCalls = int . Parse ( calls , CultureInfo . InvariantCulture ) + 1 ;
21
+ }
22
+
14
23
builder . UseSetting ( "testhostingstartup1" , "1" ) ;
15
24
builder . UseSetting ( "testhostingstartup_chain" , builder . GetSetting ( "testhostingstartup_chain" ) + "1" ) ;
25
+ builder . UseSetting ( "testhostingstartup1_calls" , numCalls . ToString ( CultureInfo . InvariantCulture ) ) ;
16
26
}
17
27
}
18
28
}
You can’t perform that action at this time.
0 commit comments