Pregled:
Začnite tako, da priključite odprtokodni naslov ASP.NET Core GitHub
Prijava do hiperpovezave je vidna.
Prijava do hiperpovezave je vidna.
Po ustvarjanju novega projekta ASP.NET Core 3.1 je programska koda naslednja:
Poglobljeno smo se poglobili v vhodno kodo v kombinaciji z izvorno kodo GitHuba.
Koda gostitelja:Prijava do hiperpovezave je vidna.
Metoda CreateDefaultBuilder
Tukaj instanciramo objekt HostBuilder, ki podeduje IHostBuilder, in dodamo sistemsko definirane delegate, kot so :appsettings.json, appsettings. {env. EnvironmentName}.json konfiguracijska datoteka, ki se bo sčasoma vrnila: vmesnik IHostBuilder.
Koda HostBuilder:Prijava do hiperpovezave je vidna.
Metoda Build bo na koncu uporabljena.
public IHost Build()
{ če (_hostBuilt) { vrzi novo InvalidOperationException(SR. BuildCalled); } _hostBuilt = resnično;
BuildHostConfiguration(); CreateHostingEnvironment(); CreateHostBuilderContext(); BuildAppConfiguration(); CreateServiceProvider();
return _appServices.GetRequiredService<IHost>();
} Metoda BuildHostConfiguration
zasebni _hostConfiguration za IConfiguracijo; IConfigurationBuilder configBuilder = novi ConfigurationBuilder() Pokliči delegata, da doda konfiguracijo nato
Metoda CreateHostingEnvironment
zasebno HostEnvironment _hostingEnvironment; _hostingEnvironment = nov HostEnvironment()
{ ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey], EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Okolja.Produkcija, ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory), }; Metoda CreateHostBuilderContext
zasebni HostBuilderContext _hostBuilderContext; _hostBuilderContext = nov HostBuilderContext(Lastnosti)
{ HostEnvironment = _hostingEnvironment, Konfiguracija = _hostConfiguration }; Metoda BuildAppConfiguration
Ponovno integrirajte konfiguracijske informacije
IConfigurationBuilder configBuilder = novi ConfigurationBuilder() . SetBasePath(_hostingEnvironment.ContentRootPath) . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true); _appConfiguration = configBuilder.Build(); _hostBuilderContext.Konfiguracija = _appConfiguration; Metoda CreateServiceProvider
var services = nova ServiceCollection(); Registrirajte storitev, pokličite delegata in dodajte uporabniško definirano storitev.
Metoda razširitve GenericHostBuilderExtensions
Prijava do hiperpovezave je vidna.
Metoda razširitve ConfigureWebHost
Za registracijo GenericWebHostService kot backend storitve:
graditelj. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>()); GenericWebHostService koda:Prijava do hiperpovezave je vidna.
javno asinhrona naloga StartAsync(CancellationToken cancellationToken) { HostEventSource.Log.HostStart();
var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>(); var addresses = serverAddressesFeature?. Naslovi; if (naslovi != null & !naslovi. IsReadOnly & naslovi. Število == 0) { var urls = Configuration[WebHostDefaults.ServerUrlsKey]; if (!string. IsNullOrEmpty(urls)) { serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);
Foreach (VAR vrednost v URL-jih. Split('; ', StringSplitOptions.RemoveEmptyEntry)) { Naslovi. Add(value); } } }
RequestDelegate? uporaba = nič;
poskusi { var configure = Options.ConfigureApplication;
if (configure == null) { vrzi novo InvalidOperationException($"Ni konfigurirane aplikacije. Prosimo, določite aplikacijo preko IWebHostBuilder.UseStartup, IWebHostBuilder.Configure ali z določitvijo zagonskega asemblerja preko {nameof(WebHostDefaults.StartupAssemblyKey)} v konfiguracija spletnega gostitelja."); }
var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);
foreach (var filter v StartupFilters.Reverse()) { configure = filter. Konfiguriraj (konfiguriraj); }
configure(builder);
Zgradite cevovod za zahteve Uporaba = graditelj. build(); } ulov (Izjema ex) { Logger.ApplicationError(ex);
če (! Options.WebHostOptions.CaptureStartupErrors) { met; }
var showDetailedErrors = HostEnvironment.IsDevelopment() || Možnosti.WebGostiteljMožnosti.PodrobneNapake;
aplikacija = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, ex); }
var httpApplication = nova HostApplication(application, Logger, DiagnosticListener, HttpContextFactory);
await Server.StartAsync(httpApplication, cancellationToken);
if (naslavlja != ničl) { foreach (var naslov v naslovih) { LifetimeLogger.ListeningOnAddress(address); } }
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 = novi GenericWebHostBuilder(builder, webHostBuilderOptions); Prijava do hiperpovezave je vidna.
Metoda razširitve WebHostBuilderExtensions
Zagotavlja objekt startupType za klice IWebHostBuilder.
ta IWebHostBuilder hostBuilder if (hostBuilder is ISupportsStartup supportsStartup)
{ return supportsStartup.UseStartup(startupType);
} Prijava do hiperpovezave je vidna.
GenericWebHostBuilder Zasebna metoda GenericWebHostBuilder
Dinamično instancirajte naš objekt Startup:
Primer ?? = ActivatorUtilities.CreateInstance(novi HostServiceProvider(webHostBuilderContext), startupType); Kontekst. Lastnosti[_startupKey] = primer; Poiščite metodo ConfigureServices
var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostEnvironment.EnvironmentName); var configureServices = configureServicesBuilder.Build(instance);
internal static ConfigureServicesBuilder Najdi ConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tip startupType, string okoljeIme) { var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), required: false); return new ConfigureServicesBuilder(servicesMethod); Poišči metodo ConfigureContainer
var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostEnvironment.EnvironmentName);
internal static ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tip startupType, string okoljeIme) { var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); return new ConfigureContainerBuilder(configureMethod); } Poišči metodo Configure
configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostEnvironment.EnvironmentName);
notranji statični ConfigureBuilder Najdi ConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tip startupType, string environmentName)
{ var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!; vrni nov ConfigureBuilder(configureMethod);
} Izvorna koda, ki jo imenuje ConfigureBuilderjeva metoda Build, je naslednja:
zasebni razred ConfigureBuilder { public ConfigureBuilder(MethodInfo configure) { MethodInfo = konfiguriraj; }
public MethodInfo MethodInfo { get; }
javni<IApplicationBuilder> Action Build (instanca objekta) { return (applicationBuilder) => Invoke(instance, applicationBuilder); }
private void Invoke(instanca objekta, IApplicationBuilder builder) { var serviceProvider = builder. Aplikacijske storitve; var parameterInfos = MethodInfo.GetParameters(); parametri var = nov objekt[parameterInfos.Length]; za (var index = 0; index < parameterInfos.Length; index++) { var parameterInfo = parameterInfos[index]; if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parametri[index] = graditelj; } else { poskusi { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } ulov (Izjema ex) { vrzi novo InvalidOperationException( Resources.FormatMiddlewareFilter_ServiceResolutionFail( parameterInfo.ParameterType.FullName, parameterInfo.Name, MethodInfo.Name, MethodInfo.DeclaringType.FullName), ex); } } } MethodInfo.Invoke(instance, parametri); } } Metoda zagona
Naslov metode razširitve HostAbstractionsHostExtensions:
Prijava do hiperpovezave je vidna.
Na koncu pokliče:
/// <summary> Zažene aplikacijo in vrne nalogo, ki se zaključi le, ko je žeton sprožen ali ko se sproži izklop. /// </summary> <param name="host"> The <see cref="IHost"/> za izvajanje.</param> <ime parametra="token">Žeton za sprožitev izklopa.</param> <returns><glej cref="Naloga"/> predstavlja asinhrono operacijo.</returns> javni statični asinhroni Task RunAsync (ta IHost gostitelj, CancellationToken token = privzeto) { poskusi { Počakajte na gostitelja. StartAsync(token). ConfigureAwait(false);
Počakajte na gostitelja. WaitForShutdownAsync(token). ConfigureAwait(false); } končno { if (gostitelj je IAsyncDisposable asyncDisposable) { await asyncDisposable.DisposeAsync(). ConfigureAwait(false); } else { gostitelj. Dispose(); }
} } Prej, ko sem gradil storitev, sem se registriral za storitev IHost, koda pa je bila naslednja:
storitve. AddSingleton<IHost>(_ => { return new Internal.Host(_appServices, _appServices.GetRequiredService<IHostApplicationLifetime>(), _appServices.GetRequiredService<ILogger<Internal.Host>>(), _appServices.GetRequiredService<IHostLifetime>(), _appServices.GetRequiredService<IOptions<HostOptions>>()); }); Metoda StartAsync
Naslov:Prijava do hiperpovezave je vidna.
public async Task StartAsync(CancellationToken cancellationToken = privzeto) { _logger. Starting();
uporaba var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping); CancellationToken združeniCancellationToken = združeniCancellationTokenSource.Token;
await _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait(false);
combinedCancellationToken.ThrowIfCancellationRequested(); _hostedServices = Services.GetService<IEnumerable<IHostedService>>();
foreach (IHostedService hostedService v _hostedServices) { // Fire IHostedService.Start await hostedService.StartAsync (combinedCancellationToken). ConfigureAwait(false);
if (hostedService is BackgroundService backgroundServiceService) { _ = HandleBackgroundException(backgroundService); } }
// Fire IHostApplicationLifetime.Started _applicationLifetime.NotifyStarted();
_logger. Started(); } (Konec)
|