File: Internal\WebHostOptions.cs
Web Access
Project: src\src\Hosting\Hosting\src\Microsoft.AspNetCore.Hosting.csproj (Microsoft.AspNetCore.Hosting)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Globalization;
using System.Linq;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
 
namespace Microsoft.AspNetCore.Hosting;
 
internal sealed class WebHostOptions
{
    public WebHostOptions(IConfiguration primaryConfiguration, IConfiguration? fallbackConfiguration = null, IHostEnvironment? environment = null)
    {
        ArgumentNullException.ThrowIfNull(primaryConfiguration);
 
        string? GetConfig(string key) => primaryConfiguration[key] ?? fallbackConfiguration?[key];
 
        ApplicationName = environment?.ApplicationName ?? GetConfig(WebHostDefaults.ApplicationKey) ?? Assembly.GetEntryAssembly()?.GetName().Name ?? string.Empty;
        StartupAssembly = GetConfig(WebHostDefaults.StartupAssemblyKey);
        DetailedErrors = WebHostUtilities.ParseBool(GetConfig(WebHostDefaults.DetailedErrorsKey));
        CaptureStartupErrors = WebHostUtilities.ParseBool(GetConfig(WebHostDefaults.CaptureStartupErrorsKey));
        Environment = environment?.EnvironmentName ?? GetConfig(WebHostDefaults.EnvironmentKey);
        WebRoot = GetConfig(WebHostDefaults.WebRootKey);
        ContentRootPath = environment?.ContentRootPath ?? GetConfig(WebHostDefaults.ContentRootKey);
        PreventHostingStartup = WebHostUtilities.ParseBool(GetConfig(WebHostDefaults.PreventHostingStartupKey));
        SuppressStatusMessages = WebHostUtilities.ParseBool(GetConfig(WebHostDefaults.SuppressStatusMessagesKey));
        ServerUrls = GetConfig(WebHostDefaults.ServerUrlsKey);
        PreferHostingUrls = WebHostUtilities.ParseBool(GetConfig(WebHostDefaults.PreferHostingUrlsKey));
 
        // Search the primary assembly and configured assemblies.
        HostingStartupAssemblies = Split(ApplicationName, GetConfig(WebHostDefaults.HostingStartupAssembliesKey));
        HostingStartupExcludeAssemblies = Split(GetConfig(WebHostDefaults.HostingStartupExcludeAssembliesKey));
 
        var timeout = GetConfig(WebHostDefaults.ShutdownTimeoutKey);
        if (!string.IsNullOrEmpty(timeout)
            && int.TryParse(timeout, NumberStyles.None, CultureInfo.InvariantCulture, out var seconds))
        {
            ShutdownTimeout = TimeSpan.FromSeconds(seconds);
        }
    }
 
    public string ApplicationName { get; }
 
    public bool PreventHostingStartup { get; }
 
    public bool SuppressStatusMessages { get; }
 
    public IReadOnlyList<string> HostingStartupAssemblies { get; }
 
    public IReadOnlyList<string> HostingStartupExcludeAssemblies { get; }
 
    public bool DetailedErrors { get; }
 
    public bool CaptureStartupErrors { get; }
 
    public string? Environment { get; }
 
    public string? StartupAssembly { get; }
 
    public string? WebRoot { get; }
 
    public string? ContentRootPath { get; }
 
    public TimeSpan ShutdownTimeout { get; } = TimeSpan.FromSeconds(30);
 
    public string? ServerUrls { get; }
 
    public bool PreferHostingUrls { get; }
 
    public IEnumerable<string> GetFinalHostingStartupAssemblies()
    {
        return HostingStartupAssemblies.Except(HostingStartupExcludeAssemblies, StringComparer.OrdinalIgnoreCase);
    }
 
    private static IReadOnlyList<string> Split(string? value)
    {
        return value?.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
            ?? Array.Empty<string>();
    }
 
    private static IReadOnlyList<string> Split(string applicationName, string? environment)
    {
        if (string.IsNullOrEmpty(environment))
        {
            return new[] { applicationName };
        }
 
        return Split($"{applicationName};{environment}");
    }
}