Recension:
Börja med att bifoga den ASP.NET Core GitHub-open source-adressen
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
Efter att ha skapat ett nytt projekt ASP.NET Core 3.1 är programkoden följande:
Vi gjorde en djupdykning i inmatningskoden kombinerat med GitHubs källkod.
Värdkod:Inloggningen med hyperlänken är synlig.
CreateDefaultBuilder-metoden
Här instansierar vi ett HostBuilder-objekt, som ärver från IHostBuilder, och lägger till systemdefinierade delegater, såsom :appsettings.json, appsettings. {env. EnvironmentName}.json konfigurationsfil, som så småningom kommer att returnera: IHostBuilder-gränssnittet.
HostBuilder-kod:Inloggningen med hyperlänken är synlig.
Byggmetoden kommer så småningom att anropas.
offentlig IHost Build()
{ om (_hostBuilt) { kasta ny InvalidOperationException(SR. BuildCalled); } _hostBuilt = sant;
BuildHostConfiguration(); CreateHostingEnvironment(); CreateHostBuilderContext(); BuildAppConfiguration(); CreateServiceProvider();
returnera _appServices.GetRequiredService<IHost>();
} BuildHostConfiguration-metoden
privat IConfiguration _hostConfiguration; IConfigurationBuilder configBuilder = ny ConfigurationBuilder() Ring delegaten för att lägga till konfiguration i sin tur
CreateHostingEnvironment-metoden
privat HostingEnvironment _hostingEnvironment; _hostingEnvironment = ny 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
Integrera konfigurationsinformationen igen
IConfigurationBuilder configBuilder = ny ConfigurationBuilder() . SetBasePath(_hostingEnvironment.ContentRootPath) . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true); _appConfiguration = configBuilder.Build(); _hostBuilderContext.Konfiguration = _appConfiguration; CreateServiceProvider-metoden
var services = ny ServiceCollection(); Registrera en tjänst, kalla en delegat och lägg till en användardefinierad tjänst.
GenericHostBuilderExtensions extensionsmetoden
Inloggningen med hyperlänken är synlig.
ConfigureWebHost-förlängningsmetoden
För att registrera GenericWebHostService som en backend-tjänst:
byggare. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>()); GenericWebHostService-kod:Inloggningen med hyperlänken är synlig.
publik asynkron Uppgift StartAsynk (CancellationToken cancellationToken) { HostingEventSource.Log.HostStart();
var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>(); var addresses = serverAddressesFeature?. Adresser; om (adresser != null && !adresser. IsReadOnly && adresser. Antal == 0) { var urls = Configuration[WebHostDefaults.ServerUrlsKey]; om (!sträng. IsNullOrEmpty(urls)) { serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Configuration, WebHostDefaults.PreferHostingUrlsKey);
Foreach (VAR-värde i URL:er. Split('; ', StringSplitOptions.RemoveEmptyEntries)) { adresser. Add(värde); } } }
RequestDelegate? tillämpning = null;
Försök { var configure = Options.ConfigureApplication;
om (konfigurera == null) { kasta ny InvalidOperationException($"Ingen applikation konfigurerad. Vänligen ange en applikation via IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, eller ange startassembler via {nameof(WebHostDefaults.StartupAssemblyKey)} i webbhotellkonfiguration."); }
var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);
foreach (var filter i StartupFilters.Reverse()) { konfigurera = filter. Konfigurera (konfigurera); }
konfigurera (byggare);
Bygg förfrågningspipelinen Applikation = byggare. Build(); } catch (Undantag t.ex.) { Logger.ApplicationError(ex);
om (! Options.WebHostOptions.CaptureStartupErrors) { kasta; }
var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;
application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, t.ex); }
var httpApplication = new HostingApplication(application, Logger, DiagnosticListener, HttpContextFactory);
await Server.StartAsync(httpApplication, cancellationToken);
om (adresser != null) { foreach (var-adress i adresser) { LifetimeLogger.ListeningOnAddress(adress); } }
if (Logger.IsEnabled(LogLevel.Debug)) { foreach (var assembly i Options.WebHostOptions.GetFinalHostingStartupAssemblies()) { Logger.StartupAssemblyLoaded(assembly); } }
om (Options.HostingStartupExceptions != null) { foreach (var-undantag i Options.HostingStartupExceptions.InnerExceptions) { Logger.HostingStartupAssemblyError(undantag); } } }
var webhostBuilder = ny GenericWebHostBuilder(builder, webHostBuilderOptions); Inloggningen med hyperlänken är synlig.
WebHostBuilderExtensions-metoden
Tillhandahåller ett startupType-objekt för IWebHostBuilder-anrop.
denna IWebHostBuilder hostBuilder if (hostBuilder är ISupportsStartup stödjerStartup)
{ return supportsStartup.UseStartup(startupType);
} Inloggningen med hyperlänken är synlig.
GenericWebHostBuilder Privat metod GenericWebHostBuilder
Instansisera vårt Startobjekt dynamiskt:
Instans?? = ActivatorUtilities.CreateInstance (ny HostServiceProvider(webHostBuilderContext), startupType); Kontext. Properties[_startupKey] = instans; Leta efter metoden ConfigureServices.
var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName); var configureServices = configureServicesBuilder.Build(instance);
intern statisk ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, sträng miljöNamn) { var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), krävs: false); returnera nya ConfigureServicesBuilder(servicesMethod); Leta efter metoden ConfigureContainer.
var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);
intern statisk ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Typ startupType, sträng miljöNamn) { var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), required: false); returnera nya ConfigureContainerBuilder(configureMethod); } Leta efter Configure metoden
configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostingEnvironment.EnvironmentName);
intern statisk ConfigureBuilder HittaConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Skriv startupType, strängmiljöNamn)
{ var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), krävs: true)!; returnera ny ConfigureBuilder(configureMethod);
} Källkoden, kallad av ConfigureBuilders Build-metod, är följande:
privatklass ConfigureBuilder { public ConfigureBuilder(MethodInfo configure) { MethodInfo = konfigurera; }
public MethodInfo MethodInfo { get; }
publik<IApplicationBuilder> Handlingsbyggande (objektinstans) { return (applicationBuilder) => Invoke (instans, applicationBuilder); }
privat void Invoke (objektinstans, IApplicationBuilder builder) { var serviceProvider = builder. Applikationstjänster; var parameterInfos = MethodInfo.GetParameters(); var-parametrar = nytt objekt[parameterInfos.Length]; för (var-index = 0; index < parameterInfos.Length; index++) { var parameterInfo = parameterInfos[index]; om (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parametrar[index] = byggare; } annars { Försök { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } catch (Undantag t.ex.) { kasta ny InvalidOperationException( Resources.FormatMiddlewareFilter_ServiceResolutionFail( parameterInfo.ParameterType.FullName, parameterInfo.Name, MethodInfo.Name, MethodInfo.DeclaringType.FullName), ex); } } } MethodInfo.Invoke(instans, parametrar); } } Körmetod
Adress för HostingAbstractionsHostExtensions extension-metod:
Inloggningen med hyperlänken är synlig.
Till slut ringer:
/// <summary> Kör en applikation och returnerar en Task som bara slutförs när token triggas eller avstängning aktiveras. /// </summary> <param name="host"><See cref="IHost"/> att köra.</param> <param name="token">Token som utlöser avstängning.</param> <returns><se cref="Uppgift"/> som representerar den asynkrona operationen.</returns> publik statisk asynkron Task RunAsync (denna IHost-värd, CancellationToken token = standard) { Försök { Vänta på värden. StartAsync(token). ConfigureAwait (falsk);
Vänta på värden. VäntaPåStängAsynk (token). ConfigureAwait (falsk); } Äntligen { if (värd är IAsyncDisposable asyncDisposable) { await asyncDisposable.DisposeAsync(). ConfigureAwait (falsk); } annars { värd. Göra sig av med(); }
} } Tidigare, när jag byggde en tjänst, registrerade jag mig för IHost-tjänsten, och koden är följande:
tjänster. AddSingleton<IHost>(_ => { returnera ny intern. Värd(_appServices, _appServices.GetRequiredService<IHostApplicationLifetime>(), _appServices.GetRequiredService<ILogger<Internal.Host>>(), _appServices.GetRequiredService<IHostLifetime>(), _appServices.GetRequiredService<IOptions<HostOptions>>()); }); StartAsync-metoden
Adress:Inloggningen med hyperlänken är synlig.
publik asynkron Uppgift StartAsynk (CancelToken cancellationToken = standard) { _logger. Start();
using var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping); CancellationToken combinedCancellationToken = combinedCancellationTokenSource.Token;
vänta _hostLifetime.WaitForStartAsync(combinedCancellationToken). ConfigureAwait (falsk);
combinedCancellationToken.ThrowIfCancellationRequested(); _hostedServices = Services.GetService<IEnumerable<IHostedService>>();
foreach (IHostedService hostade Service i _hostedServices) { Brand IHostedService.Start await hostedService.StartAsync(combinedCancellationToken). ConfigureAwait (falsk);
if (hostedService är BackgroundService backgroundService) { _ = HandleBackgroundException(backgroundService); } }
Eld IHostApplikationLifetime.Startad _applicationLifetime. NotifyStart();
_logger. Startade(); } (Slut)
|