Skip to content

Commit 70d44ef

Browse files
committed
Do not override content root with default
1 parent 0f040fe commit 70d44ef

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

src/libraries/Microsoft.Extensions.Hosting/src/HostApplicationBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,12 @@ public HostApplicationBuilder(HostApplicationBuilderSettings? settings)
8888

8989
if (!settings.DisableDefaults)
9090
{
91-
HostingHostBuilderExtensions.ApplyDefaultHostConfiguration(Configuration, settings.Args);
91+
if (Configuration[HostDefaults.ContentRootKey] is null)
92+
{
93+
HostingHostBuilderExtensions.SetDefaultContentRoot(Configuration);
94+
}
95+
96+
HostingHostBuilderExtensions.AddDefaultHostConfigurationSources(Configuration, settings.Args);
9297
}
9398

9499
// HostApplicationBuilderSettings override all other config sources.

src/libraries/Microsoft.Extensions.Hosting/src/HostingHostBuilderExtensions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ public static IHostBuilder ConfigureDefaults(this IHostBuilder builder, string[]
201201
.UseServiceProviderFactory(context => new DefaultServiceProviderFactory(CreateDefaultServiceProviderOptions(context)));
202202
}
203203

204-
internal static void ApplyDefaultHostConfiguration(IConfigurationBuilder hostConfigBuilder, string[]? args)
204+
internal static void SetDefaultContentRoot(IConfigurationBuilder hostConfigBuilder)
205205
{
206206
// If we're running anywhere other than C:\Windows\system32, we default to using the CWD for the ContentRoot.
207207
// However, since many things like Windows services and MSIX installers have C:\Windows\system32 as there CWD which is not likely
@@ -219,14 +219,23 @@ internal static void ApplyDefaultHostConfiguration(IConfigurationBuilder hostCon
219219
new KeyValuePair<string, string?>(HostDefaults.ContentRootKey, cwd),
220220
});
221221
}
222+
}
222223

224+
internal static void AddDefaultHostConfigurationSources(IConfigurationBuilder hostConfigBuilder, string[]? args)
225+
{
223226
hostConfigBuilder.AddEnvironmentVariables(prefix: "DOTNET_");
224227
if (args is { Length: > 0 })
225228
{
226229
hostConfigBuilder.AddCommandLine(args);
227230
}
228231
}
229232

233+
private static void ApplyDefaultHostConfiguration(IConfigurationBuilder hostConfigBuilder, string[]? args)
234+
{
235+
SetDefaultContentRoot(hostConfigBuilder);
236+
AddDefaultHostConfigurationSources(hostConfigBuilder, args);
237+
}
238+
230239
internal static void ApplyDefaultAppConfiguration(HostBuilderContext hostingContext, IConfigurationBuilder appConfigBuilder, string[]? args)
231240
{
232241
IHostEnvironment env = hostingContext.HostingEnvironment;

src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/HostApplicationBuilderTests.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,34 +229,46 @@ public void DisableDefaultIHostEnvironmentValues()
229229
Assert.IsAssignableFrom<PhysicalFileProvider>(env.ContentRootFileProvider);
230230
}
231231

232-
[Fact]
233-
public void ConfigurationSettingCanInfluenceEnvironment()
232+
[Theory]
233+
[InlineData(true)]
234+
[InlineData(false)]
235+
public void ConfigurationSettingCanInfluenceEnvironment(bool disableDefaults)
234236
{
237+
var tempPath = Path.GetTempPath();
238+
235239
using var config = new ConfigurationManager();
236240

237241
config.AddInMemoryCollection(new KeyValuePair<string, string>[]
238242
{
239243
new(HostDefaults.ApplicationKey, "AppA" ),
240244
new(HostDefaults.EnvironmentKey, "EnvA" ),
245+
new(HostDefaults.ContentRootKey, tempPath)
241246
});
242247

243248
var builder = new HostApplicationBuilder(new HostApplicationBuilderSettings
244249
{
245-
DisableDefaults = true,
250+
DisableDefaults = disableDefaults,
246251
Configuration = config,
247252
});
248253

249254
Assert.Equal("AppA", builder.Configuration[HostDefaults.ApplicationKey]);
250255
Assert.Equal("EnvA", builder.Configuration[HostDefaults.EnvironmentKey]);
256+
Assert.Equal(tempPath, builder.Configuration[HostDefaults.ContentRootKey]);
251257

252258
Assert.Equal("AppA", builder.Environment.ApplicationName);
253259
Assert.Equal("EnvA", builder.Environment.EnvironmentName);
260+
Assert.Equal(tempPath, builder.Environment.ContentRootPath);
261+
var fileProviderFromBuilder = Assert.IsType<PhysicalFileProvider>(builder.Environment.ContentRootFileProvider);
262+
Assert.Equal(tempPath, fileProviderFromBuilder.Root);
254263

255264
using IHost host = builder.Build();
256265

257266
var hostEnvironmentFromServices = host.Services.GetRequiredService<IHostEnvironment>();
258267
Assert.Equal("AppA", hostEnvironmentFromServices.ApplicationName);
259268
Assert.Equal("EnvA", hostEnvironmentFromServices.EnvironmentName);
269+
Assert.Equal(tempPath, hostEnvironmentFromServices.ContentRootPath);
270+
var fileProviderFromServices = Assert.IsType<PhysicalFileProvider>(hostEnvironmentFromServices.ContentRootFileProvider);
271+
Assert.Equal(tempPath, fileProviderFromServices.Root);
260272
}
261273

262274
[Fact]

0 commit comments

Comments
 (0)