Läbivaatamine:
Alusta ASP.NET Core GitHubi avatud lähtekoodiga aadressi lisamisest
Hüperlingi sisselogimine on nähtav.
Hüperlingi sisselogimine on nähtav.
Pärast uue projekti loomist Core 3.1 ASP.NET on programmi kood järgmine:
Me süvenesime sissepääsukoodi koos GitHubi lähtekoodiga.
Hostkood:Hüperlingi sisselogimine on nähtav.
CreateDefaultBuilder meetod
Siin instantsierime HostBuilderi objekti, mis pärib IHostBuilderilt, ning lisame süsteemimääratletud delegaadid, nagu :appsettings.json, rakendusseaded. {env. EnvironmentName}.json konfiguratsioonifail, mis lõpuks tagastab: IHostBuilder liides.
HostBuilderi kood:Hüperlingi sisselogimine on nähtav.
Ehitusmeetod kutsutakse lõpuks välja.
avalik IHost Build()
{ if (_hostBuilt) { viska uus InvalidOperationException(SR. BuildCalled); } _hostBuilt = tõene;
BuildHostConfiguration(); CreateHostingEnvironment(); CreateHostBuilderContext(); BuildAppConfiguration(); CreateServiceProvider();
tagasta _appServices.GetRequiredService<IHost>();
} BuildHostConfiguration meetod
privaatne IConfiguration _hostConfiguration; IConfigurationBuilder configBuilder = uus ConfigurationBuilder() Helista delegaadile, et lisada konfiguratsioon
CreateHostingEnvironment meetod
privaatne HostingEnvironment _hostingEnvironment; _hostingEnvironment = uus HostingEnvironment()
{ ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey], EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Keskkonnad. Tootmine, ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory), }; CreateHostBuilderContext meetod
privaatne HostBuilderContext _hostBuilderContext; _hostBuilderContext = uus HostBuilderContext(Properties)
{ HostingEnvironment = _hostingEnvironment, Konfiguratsioon = _hostConfiguration }; BuildAppConfiguration meetod
Integreeri konfiguratsiooniinfo uuesti
IConfigurationBuilder configBuilder = uus ConfigurationBuilder() . SetBasePath(_hostingEnvironment.ContentRootPath) . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true); _appConfiguration = configBuilder.Build(); _hostBuilderContext.Konfiguratsioon = _appConfiguration; CreateServiceProvider meetod
var services = uus ServiceCollection(); Registreeri teenus, helista delegaadile ja lisa kasutaja määratud teenus.
GenericHostBuilderExtensions laiendusmeetod
Hüperlingi sisselogimine on nähtav.
ConfigureWebHost laiendusmeetod
GenericWebHostService'i registreerimiseks taustateenusena:
Ehitaja. ConfigureServices((kontekst, teenused) => teenused. AddHostedService<GenericWebHostService>()); GenericWebHostService kood:Hüperlingi sisselogimine on nähtav.
avalik asünkroonne ülesanne StartAsync(CancellationToken cancellationToken) { HostEventSource.Log.HostStart();
var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>(); var aadressid = serverAddressesFeature?. Aadressid; kui (aadressid != null && !aadressid. IsReadOnly && aadressid. Loendus == 0) { var urls = Configuration[WebHostDefaults.ServerUrlsKey]; if (!string. IsNullOrEmpty(urls)) { serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);
foreach (VAR väärtus URL-ides. Split('; ', StringSplitOptions.RemoveEmptyEntries)) { aadressid. Lisand(väärtus); } } }
RequestDelegate? rakendus = null;
proovi { var config = Options.ConfigureApplication;
if (configure == null) { viska uus InvalidOperationException($"Rakendust pole seadistatud. Palun määrake rakendus IWebHostBuilder.UseStartup, IWebHostBuilder.Configure'i kaudu või määrake käivitusassamblee {nameof(WebHostDefaults.StartupAssemblyKey)} kaudu veebimajutuse seadistus."); }
var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);
foreach (var filter in StartupFilters.Reverse()) { configure = filter. konfigureerida (konfigureerida); }
configure(builder);
Ehita päringutoru rakendus = ehitaja. Build(); } catch (Exception ex) { Logger.ApplicationError(ex);
kui (! Options.WebHostOptions.CaptureStartupErrors) { viskamine; }
var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;
application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, nt); }
var httpApplication = uus HostingApplication(application, Logger, DiagnosticListener, HttpContextFactory);
await Server.StartAsync(httpApplication, cancellationToken);
if (aadressid != null) { foreach (VAR-aadress aadressides) { LifetimeLogger.ListeningOnAddress(aadress); } }
if (Logger.IsEnabled(LogLevel.Debug)) { foreach (var assembly in Options.WebHostOptions.GetFinalHostingStartupAssemblies()) { Logger.StartupAssemblyLoaded(assembly); } }
if (Options.HostingStartupExceptions != null) { foreach (var exception in Options.HostingStartupExceptions.InnerExceptions) { Logger.HostingStartupAssemblyError(exception); } } }
var webhostBuilder = uus GenericWebHostBuilder (builder, webHostBuilderOptions); Hüperlingi sisselogimine on nähtav.
WebHostBuilderExtensions laiendusmeetod
Pakub startupType objekti IWebHostBuilder kutsete jaoks.
see IWebHostBuilder hostBuilder if (hostBuilder on ISupportsStartup supportsStartup)
{ return supportsStartup.UseStartup(startupType);
} Hüperlingi sisselogimine on nähtav.
GenericWebHostBuilder privaatmeetod GenericWebHostBuilder
Dünaamiliselt instantsieerida meie Startup-objekt:
Instants ?? = ActivatorUtilities.CreateInstance(uus HostServiceProvider(webHostBuilderContext), startupType); Kontekst. Properties[_startupKey] = eksemplar; Otsi ConfigureServices meetodit
var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName); var configureServices = configureServicesBuilder.Build(instance);
sisemine staatiline ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, string environmentName) { var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), vajalik: väär) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), vajalik: false); tagasta uus ConfigureServicesBuilder(servicesMethod); Otsi ConfigureContainer meetodit
var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);
sisemine staatiline ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, string environmentName) { var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); return new ConfigureContainerBuilder(configureMethod); } Otsi Configure meetodit
configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostingEnvironment.EnvironmentName);
sisemine staatiline ConfigureBuilder FindConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, string environmentName)
{ var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!; return new ConfigureBuilder(configureMethod);
} ConfigureBuilderi Build meetodi järgi kutsutud lähtekood on järgmine:
privaatklass ConfigureBuilder { public ConfigureBuilder(MethodInfo configure) { MethodInfo = seadistada; }
public MethodInfo MethodInfo { get; }
public Action<IApplicationBuilder> Build (objekti eksemplar) { return (applicationBuilder) => Invoke(instance, applicationBuilder); }
private void Invoke(object instance, IApplicationBuilder builder) { var serviceProvider = ehitaja. ApplicationServices; var parameterInfos = MethodInfo.GetParameters(); var parameetrid = uus objekt[parameterInfos.Length]; for (var indeks = 0; indeks < parameeterInfos.Pikkus; indeks++) { var parameterInfo = parameterInfos[index]; if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parameetrid[indeks] = ehitaja; } else { proovi { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } catch (Exception ex) { viska uus InvalidOperationException( Resources.FormatMiddlewareFilter_ServiceResolutionFail( parameterInfo.ParameterType.FullName, parameterInfo.Name, MethodInfo.Name, MethodInfo.DeclaringType.FullName), ex); } } } MethodInfo.Invoke(instance, parameters); } } Run-meetod
HostingAbstractionsHostExtensions laienduse meetodi aadress:
Hüperlingi sisselogimine on nähtav.
Lõpuks helistab:
/// <summary> Käivitab rakenduse ja tagastab ülesande, mis lõpeb ainult siis, kui token käivitatakse või käivitatakse väljalülitus. /// </summary> <param name="host"> <vt cref="IHost"/> käivitamiseks.</param> <param name="token">Token, mis käivitab sulgemise.</param> <returns><see cref="Task"/>, mis esindab asünkroonset operatsiooni.</returns> avalik staatiline asünkroonne ülesanne RunAsync (see IHost host, CancellationToken token = vaikimisi) { proovi { Oota peremeest. StartAsync (token). ConfigureAwait (vale);
Oota peremeest. WaitForShutdownAsync(token). ConfigureAwait (vale); } lõpuks { if (host on IAsyncDisposable asyncDisposable) { oota asyncDisposable.DisposeAsync(). ConfigureAwait (vale); } else { Saatejuht. Dispose(); }
} } Varem, kui ma teenust ehitasin, registreerusin IHost teenusele ja kood oli järgmine:
teenused. <IHost>AddSingleton(_ => { return new Internal.Host(_appServices, _appServices.GetRequiredService<IHostApplicationLifetime>(), _appServices.GetRequiredService<ILogger<Internal.Host>>(), _appServices.GetRequiredService<IHostLifetime>(), _appServices.GetRequiredService<<HostOptions>IOptions>()); }); StartAsync meetod
Aadress:Hüperlingi sisselogimine on nähtav.
avalik asünkroonne ülesanne StartAsync(CancellationToken cancellationToken = vaikimisi) { _logger. Starting();
kasutades var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping); CancellationToken combinedCancellationToken = combinedCancellationTokenSource.Token;
await _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait (vale);
combinedCancellationToken.ThrowIfCancellationRequested(); _hostedServices = Services.GetService<<IHostedService>IEnumerable>();
foreach (IHostedService hostedService _hostedServices) { Tulekahju IHostedService.Alusta await hostedService.StartAsync(combinedCancellationToken). ConfigureAwait (vale);
if (hostedService on BackgroundService backgroundService) { _ = HandleBackgroundException(backgroundService); } }
Tulekahju IHostApplicationLifetime. Alustatud _applicationLifetime.NotifyStarted();
_logger. Start(); } (Lõpp)
|