Beispiel #1
0
    private RequestDelegate BuildApplication()
    {
        Debug.Assert(_applicationServices != null, "Initialize must be called first.");

        try
        {
            _applicationServicesException?.Throw();
            EnsureServer();

            var builderFactory = _applicationServices.GetRequiredService <IApplicationBuilderFactory>();
            var builder        = builderFactory.CreateBuilder(Server.Features);
            builder.ApplicationServices = _applicationServices;

            var startupFilters = _applicationServices.GetService <IEnumerable <IStartupFilter> >();
            Action <IApplicationBuilder> configure = _startup !.Configure;
            if (startupFilters != null)
            {
                foreach (var filter in startupFilters.Reverse())
                {
                    configure = filter.Configure(configure);
                }
            }

            configure(builder);

            return(builder.Build());
        }
        catch (Exception ex)
        {
            if (!_options.SuppressStatusMessages)
            {
                // Write errors to standard out so they can be retrieved when not in development mode.
                Console.WriteLine("Application startup exception: " + ex.ToString());
            }
            var logger = _applicationServices.GetRequiredService <ILogger <WebHost> >();
            _logger.ApplicationError(ex);

            if (!_options.CaptureStartupErrors)
            {
                throw;
            }

            EnsureServer();

            // Generate an HTML error page.
            var hostingEnv         = _applicationServices.GetRequiredService <IHostEnvironment>();
            var showDetailedErrors = hostingEnv.IsDevelopment() || _options.DetailedErrors;

            return(ErrorPageBuilder.BuildErrorPageApplication(hostingEnv.ContentRootFileProvider, logger, showDetailedErrors, ex));
        }
    }
Beispiel #2
0
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        HostingEventSource.Log.HostStart();

        var serverAddressesFeature = Server.Features.Get <IServerAddressesFeature>();
        var addresses = serverAddressesFeature?.Addresses;

        if (addresses != null && !addresses.IsReadOnly && addresses.Count == 0)
        {
            var urls = Configuration[WebHostDefaults.ServerUrlsKey];
            if (!string.IsNullOrEmpty(urls))
            {
                serverAddressesFeature !.PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);

                foreach (var value in urls.Split(';', StringSplitOptions.RemoveEmptyEntries))
                {
                    addresses.Add(value);
                }
            }
        }

        RequestDelegate?application = null;

        try
        {
            var configure = Options.ConfigureApplication;

            if (configure == null)
            {
                throw new InvalidOperationException($"No application configured. Please specify an application via IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, or specifying the startup assembly via {nameof(WebHostDefaults.StartupAssemblyKey)} in the web host configuration.");
            }

            var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);

            foreach (var filter in StartupFilters.Reverse())
            {
                configure = filter.Configure(configure);
            }

            configure(builder);

            // Build the request pipeline
            application = builder.Build();
        }
        catch (Exception ex)
        {
            Logger.ApplicationError(ex);

            if (!Options.WebHostOptions.CaptureStartupErrors)
            {
                throw;
            }

            var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;

            application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, ex);
        }

        var httpApplication = new HostingApplication(application, Logger, DiagnosticListener, ActivitySource, Propagator, HttpContextFactory);

        await Server.StartAsync(httpApplication, cancellationToken);

        if (addresses != null)
        {
            foreach (var address in addresses)
            {
                Log.ListeningOnAddress(LifetimeLogger, address);
            }
        }

        if (Logger.IsEnabled(LogLevel.Debug))
        {
            foreach (var assembly in Options.WebHostOptions.GetFinalHostingStartupAssemblies())
            {
                Log.StartupAssemblyLoaded(Logger, assembly);
            }
        }

        if (Options.HostingStartupExceptions != null)
        {
            foreach (var exception in Options.HostingStartupExceptions.InnerExceptions)
            {
                Logger.HostingStartupAssemblyError(exception);
            }
        }
    }