Anmeldelse:
Start med at vedhæfte den ASP.NET Core GitHub open source-adresse
Hyperlink-login er synlig.
Hyperlink-login er synlig.
Efter at have oprettet et nyt projekt ASP.NET Core 3.1, er programkoden som følger:
Vi dykkede dybt ned i adgangskoden kombineret med GitHub-kildekoden.
Værtskode:Hyperlink-login er synlig.
CreateDefaultBuilder-metoden
Her instansierer vi et HostBuilder-objekt, som arver fra IHostBuilder, og tilføjer systemdefinerede delegerede, såsom :appsettings.json, appsettings. {env. EnvironmentName}.json konfigurationsfil, som til sidst vil returnere: IHostBuilder-interfacet.
HostBuilder-kode:Hyperlink-login er synlig.
Build-metoden vil til sidst blive kaldt.
offentlig IHost Build()
{ hvis (_hostBuilt) { smid ny InvalidOperationException(SR. BuildCalled); } _hostBuilt = sand;
BuildHostConfiguration(); CreateHostingEnvironment(); CreateHostBuilderContext(); BuildAppConfiguration(); CreateServiceProvider();
returner _appServices.GetRequiredService<IHost>();
} BuildHostConfiguration-metoden
privat IConfiguration _hostConfiguration; IConfigurationBuilder configBuilder = ny ConfigurationBuilder() Ring til delegaten for at tilføje konfiguration igen
CreateHostingEnvironment-metoden
privat HostingEnvironment _hostingEnvironment; _hostingEnvironment = nyt HostingEnvironment()
{ ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey], EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Miljøer.Produktion, ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory), }; CreateHostBuilderContext-metoden
privat HostBuilderContext _hostBuilderContext; _hostBuilderContext = ny HostBuilderContext(Properties)
{ HostingEnvironment = _hostingEnvironment, Konfiguration = _hostConfiguration }; BuildAppConfiguration-metoden
Integrer konfigurationsinformationen igen
IConfigurationBuilder configBuilder = ny ConfigurationBuilder() . SetBasePath(_hostingEnvironment.ContentRootPath) . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true); _appConfiguration = configBuilder.Build(); _hostBuilderContext.Configuration = _appConfiguration; CreateServiceProvider-metoden
var services = ny ServiceCollection(); Registrer en tjeneste, kald en delegeret, og tilføj en brugerdefineret tjeneste.
GenericHostBuilderExtensions udvidelsesmetoden
Hyperlink-login er synlig.
ConfigureWebHost-udvidelsesmetoden
For at registrere GenericWebHostService som en backend-tjeneste:
Bygger. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>()); GenericWebHostService-kode:Hyperlink-login er synlig.
offentlig asynkron opgavestartAsynk (CancellationToken annulleringstoken) { HostingEventSource.Log.HostStart();
var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>(); var addresses = serverAddressesFeature?. Adresser; hvis (adresser != null && !adresser. IsReadOnly && adresser. Antal == 0) { var urls = Configuration[WebHostDefaults.ServerUrlsKey]; hvis (!string. IsNullOrEmpty(urls)) { serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);
foreach (var-værdi i URL'er. Split('; ', StringSplitOptions.RemoveEmptyEntries)) { adresser. Add(værdi); } } }
RequestDelegate? anvendelse = null;
Prøv { var configure = Options.ConfigureApplication;
hvis (konfigurere == null) { smid ny InvalidOperationException($"Ingen applikation konfigureret. Angiv venligst en applikation via IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, eller angiv startup-assemblyen via {nameof(WebHostDefaults.StartupAssemblyKey)} i webhostkonfiguration."); }
var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);
foreach (var-filter i StartupFilters.Reverse()) { konfigurere = filter. Konfigurér (konfigurér); }
konfigurér (bygger);
Byg anmodningspipelinen Anvendelse = Bygger. Build(); } catch (Undtagelse f.eks.) { Logger.ApplicationError(f.eks.);
hvis (! Options.WebHostOptions.CaptureStartupErrors) { kast; }
var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;
application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, f.eks.); }
var httpApplication = new HostingApplication(application, Logger, DiagnosticListener, HttpContextFactory);
await Server.StartAsync(httpApplication, cancellationToken);
hvis (adresser != null) { foreach (VAR-adresse i adresser) { LifetimeLogger.ListeningOnAddress(adresse); } }
hvis (Logger.IsEnabled(LogLevel.Debug)) { foreach (var assembly i Options.WebHostOptions.GetFinalHostingStartupAssemblies()) { Logger.StartupAssemblyLoaded(assembly); } }
hvis (Options.HostingStartupExceptions != null) { foreach (var-undtagelse i Options.HostingStartupExceptions.InnerExceptions) { Logger.HostingStartupAssemblyError(undtagelse); } } }
var webhostBuilder = ny GenericWebHostBuilder(builder, webHostBuilderOptions); Hyperlink-login er synlig.
WebHostBuilderExtensions udvidelsesmetoden
Leverer et startupType-objekt til IWebHostBuilder-kald.
denne IWebHostBuilder hostBuilder if (hostBuilder er ISupportsStartup supportsStartup)
{ return supportsStartup.UseStartup(startupType);
} Hyperlink-login er synlig.
GenericWebHostBuilder Privat metode GenericWebHostBuilder
Instansier vores Startup-objekt dynamisk:
instans ?? = ActivatorUtilities.CreateInstance(ny HostServiceProvider(webHostBuilderContext), startupType); kontekst. Egenskaber[_startupKey] = instans; Søg efter ConfigureServices-metoden
var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName); var configureServices = configureServicesBuilder.Build(instance);
intern statisk ConfigureServicesBuilder Find ConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, streng miljøNavn) { var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), krævet: false) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), krævet: false); returner ny ConfigureServicesBuilder(servicesMethod); Søg efter ConfigureContainer-metoden
var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);
intern statisk ConfigureContainerBuilder Find ConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, streng miljøNavn) { var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); returner ny ConfigureContainerBuilder(configureMethod); } Se efter Configure metoden
configureBuilder = StartupLoader.FindConfigureDelegate(startupType, kontekst. HostingEnvironment.EnvironmentName);
intern statisk ConfigureBuilder Find ConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, strengmiljøNavn)
{ var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true)!; returner ny ConfigureBuilder(configureMethod);
} Kaldet af ConfigureBuilders Build-metode er kildekoden som følger:
privat klasse ConfigureBuilder { public ConfigureBuilder(MethodInfo configure) { MethodInfo = konfigurér; }
public MethodInfo MethodInfo { get; }
offentlig Action<IApplicationBuilder> Build(objektinstans) { return (applicationBuilder) => Invoke (instance, applicationBuilder); }
privat void Invoke (objektinstans, IApplicationBuilder builder) { var serviceProvider = builder. Applikationstjenester; var parameterInfos = MethodInfo.GetParameters(); var parameters = nyt objekt[parameterInfos.Length]; for (var-indeks = 0; indeks < parameterInfos.Længde; indeks++) { var parameterInfo = parameterInfos[index]; hvis (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parametre[index] = bygger; } ellers { Prøv { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } catch (Undtagelse f.eks.) { smid ny InvalidOperationException( Resources.FormatMiddlewareFilter_ServiceResolutionFail( parameterInfo.ParameterType.FuldNavn, parameterInfo.Name, MethodInfo.Name, MetodeInfo.DeclaringType.FuldNavn), f.eks.); } } } MethodInfo.Invoke(instans, parametre); } } Kør-metoden
Adressen til HostingAbstractionsHostExtensions udvidelsesmetode:
Hyperlink-login er synlig.
Til sidst ringer han:
/// <summary> Kører en applikation og returnerer en opgave, der kun fuldføres, når tokenet udløses eller nedlukning aktiveres. /// </summary> <param name="host">Den <se cref="IHost"/> at køre.</param> <param name="token">Tokenet til at udløse nedlukning.</param> <returns><se cref="Task"/>, der repræsenterer den asynkrone operation.</returns> offentlig statisk asynkron Task RunAsync (denne IHost-vært, CancellationToken token = standard) { Prøv { Vent på værten. StartAsync (token). ConfigureAwait (falsk);
Vent på værten. WaitForShutdownAsync(token). ConfigureAwait (falsk); } Endelig { if (værten er IAsyncDisposable asyncDisposable) { await asyncDisposable.DisposeAsync(). ConfigureAwait (falsk); } ellers { vært. Bortskaff(); }
} } Tidligere, da jeg byggede en tjeneste, registrerede jeg mig for IHost-tjenesten, og koden er som følger:
tjenester. AddSingleton<IHost>(_ => { returner ny Internal.Host(_appServices, _appServices.GetRequiredService<IHostApplicationLifetime>(), _appServices.GetRequiredService<ILogger<Internal.Host>>(), _appServices.GetRequiredService<IHostLifetime>(), _appServices.GetRequiredService<IOptions<HostOptions>>()); }); StartAsync-metoden
Adresse:Hyperlink-login er synlig.
offentlig asynkron OpgavestartAsynk (CancellationToken annulleringToken = standard) { _logger. Start();
using var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping); CancellationToken kombineretAnnulleringsToken = kombineretAnnulleringTokenKilde.Token;
vent _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait (falsk);
combinedCancellationToken.ThrowIfCancellationRequested(); _hostedServices = Services.GetService<IEnumerable<IHostedService>>();
foreach (IHostedService hostede Service i _hostedServices) { Brand IHostedService.Start await hostedService.StartAsync(combinedCancellationToken). ConfigureAwait (falsk);
hvis (hostedService er Baggrundstjeneste baggrundstjeneste) { _ = HandleBackgroundException(backgroundService); } }
Fire IHostApplicationLifetime.Startede _applicationLifetime. NotifyStarted();
_logger. Started(); } (Slut)
|