Arvostelu:
Aloita liittämällä ASP.NET Core GitHubin avoimen lähdekoodin osoite
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
Kun luodaan uusi projekti Core 3.1 ASP.NET ä varten, ohjelmakoodi on seuraava:
Sukelsimme syvällisesti sisäänpääsykoodiin yhdistettynä GitHubin lähdekoodiin.
Isäntäkoodi:Hyperlinkin kirjautuminen on näkyvissä.
CreateDefaultBuilder -menetelmä
Tässä instanssimme HostBuilder-objektin, joka perii IHostBuilderilta, ja lisäämme järjestelmämääritelmät delegaatit, kuten :appsettings.json, sovellusasetukset. {env. EnvironmentName}.json konfiguraatiotiedosto, joka lopulta palauttaa: IHostBuilder-rajapinta.
HostBuilder-koodi:Hyperlinkin kirjautuminen on näkyvissä.
Build-menetelmä tullaan lopulta kutsumaan.
julkinen IHost Build()
{ if (_hostBuilt) { heitä uusi InvalidOperationException(SR. BuildCalled); } _hostBuilt = tosi;
BuildHostConfiguration(); CreateHostingEnvironment(); CreateHostBuilderContext(); BuildAppConfiguration(); CreateServiceProvider();
return _appServices.GetRequiredService<IHost>();
} BuildHostConfiguration-menetelmä
yksityinen IConfiguration _hostConfiguration; IConfigurationBuilder configBuilder = uusi ConfigurationBuilder() Soita edustajalle ja lisää konfiguraatio vuorollaan
CreateHostingEnvironment -metodi
yksityinen HostingEnvironment _hostingEnvironment; _hostingEnvironment = uusi HostingEnvironment()
{ ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey], EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Ympäristöt. Tuotanto, ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory), }; CreateHostBuilderContext -metodi
yksityinen HostBuilderContext _hostBuilderContext; _hostBuilderContext = uusi HostBuilderContext(Properties)
{ HostingEnvironment = _hostingEnvironment, Konfiguraatio = _hostConfiguration }; BuildAppConfiguration-menetelmä
Integroi konfiguraatiotiedot uudelleen
IConfigurationBuilder configBuilder = uusi ConfigurationBuilder() . SetBasePath (_hostingEnvironment.ContentRootPath) . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true); _appConfiguration = configBuilder.Build(); _hostBuilderContext.Konfiguraatio = _appConfiguration; CreateServiceProvider-menetelmä
var services = uusi ServiceCollection(); Rekisteröi palvelu, soita edustajalle ja lisää käyttäjän määrittelemä palvelu.
GenericHostBuilderExtensions laajennusmenetelmä
Hyperlinkin kirjautuminen on näkyvissä.
ConfigureWebHost-laajennusmenetelmä
GenericWebHostServicen rekisteröinti backend-palveluksi:
rakentaja. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>()); GenericWebHostService -koodi:Hyperlinkin kirjautuminen on näkyvissä.
julkinen asynkroninen tehtävä StartAsync(PeruutusTokenin peruutusToken) { HostingEventSource.Log.HostStart();
var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>(); var addresses = serverAddressesFeature?. Osoitteet; if (addresses != null && !addresses. IsReadOnly && -osoitteet. Lukumäärä == 0) { var urls = Configuration[WebHostDefaults.ServerUrlsKey]; if (!string. IsNullOrEmpty(urls)) { serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);
foreach (var-arvo url-osoitteina. Split('; ', StringSplitOptions.RemoveEmptyEntries)) { osoitteet. Add(value); } } }
RequestDelegate? application = null;
yritä { var configure = Options.ConfigureApplication;
if (configure == null) { heitä uusi InvalidOperationException($"Ei sovellusta konfiguroitu. Määritä sovellus IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, tai määritä käynnistyskokoonpano {nameof(WebHostDefaults.StartupAssemblyKey)} kautta web-isäntäkoneen asetus."); }
var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);
foreach (var-suodatin StartupFilters.Reverse()) { konfiguroi = suodatin. konfiguroi (konfiguroi); }
configure(builder);
Rakenna pyyntöputki sovellus = rakentaja. Build(); } catch (poikkeus esim.) { Logger.ApplicationError(ex);
jos (! Options.WebHostOptions.CaptureStartupErrors) { heitto; }
var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;
application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, esim); }
var httpApplication = uusi HostingApplication (application, Logger, DiagnosticListener, HttpContextFactory);
await Server.StartAsync(httpApplication, cancellationToken);
if (osoitteet != null) { foreach (VAR-osoite osoitteissa) { 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 = uusi GenericWebHostBuilder(builder, webHostBuilderOptions); Hyperlinkin kirjautuminen on näkyvissä.
WebHostBuilderExtensions-laajennusmenetelmä
Tarjoaa startupType-objektin IWebHostBuilder-kutsuille.
tämä IWebHostBuilder hostBuilder if (hostBuilder on ISupportsStartup supportsStartup)
{ return supportsStartup.UseStartup(startupType);
} Hyperlinkin kirjautuminen on näkyvissä.
GenericWebHostBuilder Private Method GenericWebHostBuilder
Dynaamisesti instanssioi Startup-objektimme:
instanssi ?? = ActivatorUtilities.CreateInstance(uusi HostServiceProvider(webHostBuilderContext), startupType); Konteksti. Properties[_startupKey] = instanssi; Etsi ConfigureServices-menetelmää
var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName); var configureServices = configureServicesBuilder.Build(instance);
sisäinen staattinen ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tyyppi startupType, merkkijono environmentName) { var servicesMethod = FindMethod (startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), vaaditaan: väärin) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), vaaditaan: väärin); palauttaa uusi ConfigureServicesBuilder(servicesMethod); Etsi ConfigureContainer-menetelmää
var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);
sisäinen staattinen ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tyyppi startupType, merkkijono environmentName) { var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); palauttaa new ConfigureContainerBuilder(configureMethod); } Etsi Config-metodi
configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostingEnvironment.EnvironmentName);
sisäinen staattinen ConfigureBuilder FindConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Tyyppi startupType, merkkijono ympäristöName)
{ var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!; palauttaa new ConfigureBuilder(configureMethod);
} ConfigureBuilderin Build-metodilla kutsuttu lähdekoodi on seuraava:
yksityinen luokka ConfigureBuilder { public ConfigureBuilder(MethodInfo configure) { MethodInfo = konfiguroi; }
julkinen MethodInfo MethodInfo { saa; }
public Action<IApplicationBuilder> Build (objekti-instanssi) { return (applicationBuilder) => Invoke(instance, applicationBuilder); }
private void Invoke (object instance, IApplicationBuilder builder) { var serviceProvider = builder. ApplicationServices; var parametriInfos = MethodInfo.GetParameters(); var parameters = new object[parameterInfos.Length]; kun (var-indeksi = 0; indeksi < parametriInfos.Pituus; indeksi++) { var parameterInfo = parameterInfos[index]; if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parametrit[indeksi] = rakentaja; } else { yritä { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } catch (poikkeus esim.) { heittää uusi InvalidOperationException( Resources.FormatMiddlewareFilter_ServiceResolutionFail( parameterInfo.ParameterType.FullName, parameterInfo.Name, MethodInfo.Name, MethodInfo.DeclaringType.FullName), ex); } } } MethodInfo.Invoke (instanssi, parametrit); } } Juoksumenetelmä
HostingAbstractionsHostExtensions -laajennusmenetelmän osoite:
Hyperlinkin kirjautuminen on näkyvissä.
Lopulta soittaa:
/// <summary> Käynnistää sovelluksen ja palauttaa tehtävän, joka valmistuu vain, kun token laukaistaan tai sammutus. /// </summary> <param name="isäntä"> <katso cref="IHost"/> käynnistää.</param> <param name="token"> Token, joka laukaisee sammutuksen.</param> <returns><see cref="Tehtävä"/>, joka edustaa asynkronista operaatiota.</returns> julkinen staattinen asynkroninen tehtävä RunAsync (tämä IHost-isäntä, CancellationToken-token = oletus) { yritä { Odota isäntä. StartAsync(token). ConfigureAwait (väärin);
Odota isäntä. WaitForShutdownAsync(token). ConfigureAwait (väärin); } vihdoin { if (isäntä on IAsyncDisposable asyncDisposable) { odota asyncDisposable.DisposeAsync(). ConfigureAwait (väärin); } else { isäntä. Dispose(); }
} } Aiemmin, kun rakensin palvelua, rekisteröidyin IHost-palveluun, ja koodi on seuraava:
palveluksia. <IHost>AddSingleton(_ => { return new Internal.Host(_appServices, _appServices.GetRequiredService<IHostApplicationLifetime>(), _appServices.GetRequiredService<ILogger<Internal.Host>>(), _appServices.GetRequiredService<IHostLifetime>(), _appServices.GetRequiredService<IOptions<HostOptions>>()); }); StartAsync-menetelmä
Osoite:Hyperlinkin kirjautuminen on näkyvissä.
public async Tehtävä StartAsync(CancellationToken cancellationToken = default) { _logger. Starting();
käyttäen var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping); CancellationToken combinedCancellationToken = combinedCancellationTokenSource.Token;
odota _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait (väärin);
combinedCancellationToken.ThrowIfCancellationRequested(); _hostedServices = Services.GetService<<IHostedService>IEnumerable>();
foreach (IHostedService hostedService vuonna _hostedServices) { Fire IHostedService.Aloita await hostedService.StartAsync(combinedCancellationToken). ConfigureAwait (väärin);
if (hostedService on BackgroundService backgroundService) { _ = HandleBackgroundException(backgroundService); } }
Fire IHostApplicationLifetime.Aloitettu _applicationLifetime.NotifyStarted();
_logger. Started(); } (Loppu)
|