Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 59583|Antwort: 1

[Quelle] ASP.NET Core (7) Tiefgehende Analyse des Framework-Quellcodes

[Link kopieren]
Veröffentlicht am 24.03.2021, 13:43:28 | | |
Rezension:

ASP.NET Core (VI) DI erhält manuell die Methode zum Einschleusen von Objekten
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (fünf) basiert auf CAP-verteilten Transaktionen
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4)-Filter einheitliche ModelState-Modellvalidierung
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Erstellen Sie Instanzen dynamisch mit ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Die Anwendung per Code neu starten
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) verwendet Redis-Caching
https://www.itsvse.com/thread-9393-1-1.html
Beginnen Sie damit, die ASP.NET Core GitHub-Open-Source-Adresse anzuhängen

Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.


asp.net Kern-Quellcodeadresse
https://www.itsvse.com/thread-9394-1-1.html


Nach der Erstellung eines neuen Projekts ASP.NET Core 3.1 sieht der Programmcode wie folgt aus:

Wir haben uns intensiv mit dem Eingangscode zusammen mit dem GitHub-Quellcode beschäftigt.

Host-Code:Der Hyperlink-Login ist sichtbar.

CreateDefaultBuilder-Methode

Hier instanziieren wir ein HostBuilder-Objekt, das von IHostBuilder erbt, und fügen systemdefinierte Delegates wie :appsettings.json appsettings hinzu. {env. EnvironmentName}.json Konfigurationsdatei, die schließlich zurückgeben wird: IHostBuilder-Schnittstelle.

HostBuilder-Code:Der Hyperlink-Login ist sichtbar.

Die Build-Methode wird schließlich aufgerufen.


öffentlicher IHost Build()
{
    wenn (_hostBuilt)
    {
        Werfe neue InvalidOperationException(SR. BuildCalled);
    }
    _hostBuilt = wahr;

    BuildHostConfiguration();
    CreateHostingEnvironment();
    CreateHostBuilderContext();
    BuildAppConfiguration();
    CreateServiceProvider();

    zurückgeben _appServices.GetRequiredService<IHost>();
}
BuildHostConfiguration-Methode

private IConfiguration _hostConfiguration;
IConfigurationBuilder configBuilder = neuer ConfigurationBuilder()
Ruf den Delegat an, um die Konfiguration nacheinander hinzuzufügen

CreateHostingEnvironment-Methode

private HostingEnvironment _hostingEnvironment;
_hostingEnvironment = neue HostingEnvironment()
{
    ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey],
    EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Umgebungen. Produktion,
    ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory),
};
CreateHostBuilderContext-Methode

private HostBuilderContext _hostBuilderContext;
_hostBuilderContext = neuer HostBuilderContext(Properties)
{
    HostingEnvironment = _hostingEnvironment,
    Konfiguration = _hostConfiguration
};
BuildAppConfiguration-Methode

Integriere die Konfigurationsinformationen erneut

IConfigurationBuilder configBuilder = neuer ConfigurationBuilder()
                . SetBasePath(_hostingEnvironment.ContentRootPath)
                . AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);
_appConfiguration = configBuilder.Build();
            _hostBuilderContext.Konfiguration = _appConfiguration;
CreateServiceProvider-Methode

var services = neuer ServiceCollection();
Registrieren Sie einen Service, rufen Sie einen Delegaten an und fügen Sie einen benutzerdefinierten Service hinzu.

GenericHostBuilderExtensions-Erweiterungsmethode

Der Hyperlink-Login ist sichtbar.

ConfigureWebHost-Erweiterungsmethode

Um GenericWebHostService als Backend-Dienst zu registrieren:


Bauherr. ConfigureServices((context, services) => services. AddHostedService<GenericWebHostService>());
GenericWebHostService-Code:Der Hyperlink-Login ist sichtbar.


öffentlich asynchron Task StartAsync(CancellationToken cancellationToken)
        {
            HostingEventSource.Log.HostStart();

            var serverAddressesFeature = Server.Features.Get<IServerAddressesFeature>();
            var addresses = serverAddressesFeature?. Adressen;
            wenn (adressiert != null && !adressen. IsReadOnly && Adressen. Anzahl == 0)
            {
                var urls = Configuration[WebHostDefaults.ServerUrlsKey];
                wenn (!string. IsNullOrEmpty(urls))
                {
                    serverAddressesFeature!. PreferHostingUrls = WebHostUtilities.ParseBool(Konfiguration, WebHostDefaults.PreferHostingUrlsKey);

                    foreach (VAR-Wert in URLs. Split('; ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        Adressen. Add(Value);
                    }
                }
            }

            RequestDelegate? Anwendung = null;

            Versuch es
            {
                var configure = Options.ConfigureApplication;

                wenn (configure == null)
                {
                    neue InvalidOperationException($" Keine Anwendung konfiguriert. Bitte geben Sie eine Anwendung über IWebHostBuilder.UseStartup, IWebHostBuilder.Conconfigure an oder geben Sie die Start-Assembler über {nameof(WebHostDefaults.StartupAssemblyKey)} in der Webhost-Konfiguration.");
                }

                var builder = ApplicationBuilderFactory.CreateBuilder(Server.Features);

                foreach (varfilter in StartupFilters.Reverse())
                {
                    konfigurieren = filtern. Konfigurieren(konfigurieren);
                }

                konfigurieren(Bauer);

                Baue die Anfragepipeline
                Anwendung = Bauer. Build();
            }
            catch (Ausnahme z. B.)
            {
                Logger.ApplicationError(ex);

                wenn (! Options.WebHostOptions.CaptureStartupErrors)
                {
                    werfen;
                }

                var showDetailedErrors = HostingEnvironment.IsDevelopment() || Options.WebHostOptions.DetailedErrors;

                application = ErrorPageBuilder.BuildErrorPageApplication(HostingEnvironment.ContentRootFileProvider, Logger, showDetailedErrors, z.B.);
            }

            var httpApplication = new HostingApplication(application, Logger, DiagnosticListener, HttpContextFactory);

            await Server.StartAsync(httpApplication, cancellationToken);

            wenn (adressiert != null)
            {
                foreach (VAR-Adresse in Adressen)
                {
                    LifetimeLogger.ListeningOnAddress(Adresse);
                }
            }

            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(Ausnahme);
                }
            }
        }


var webhostBuilder = neuer GenericWebHostBuilder(builder, webHostBuilderOptions);
Der Hyperlink-Login ist sichtbar.

Erweiterungsmethode WebHostBuilderExtensions

Stellt ein startupType-Objekt für IWebHostBuilder-Aufrufe bereit.

dieser IWebHostBuilder hostBuilder
if (hostBuilder ist ISupportsStartup unterstütztStartup)
{
    return unterstütztStartup.UseStartup(startupType);
}
Der Hyperlink-Login ist sichtbar.

GenericWebHostBuilder Private Methode GenericWebHostBuilder

Dynamisch instanziieren wir unser Startobjekt:

Instanz ?? = ActivatorUtilities.CreateInstance(neuer HostServiceProvider(webHostBuilderContext), startupType);
Kontext. Eigenschaften[_startupKey] = Instanz;
Suchen Sie nach der ConfigureServices-Methode

var configureServicesBuilder = StartupLoader.FindConfigureServicesDelegate(startupType, context. HostingEnvironment.EnvironmentName);
                var configureServices = configureServicesBuilder.Build(instance);

interne statische ConfigureServicesBuilder FindConfigureServicesDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Geben Sie startupType, String ein environmentName)
        {
            var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), erforderlich: false)
                ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), erforderlich: false);
            neue ConfigureServicesBuilder(servicesMethod) zurückgeben;
Suchen Sie nach der ConfigureContainer-Methode

var configureContainerBuilder = StartupLoader.FindConfigureContainerDelegate(startupType, context. HostingEnvironment.EnvironmentName);

interne statische ConfigureContainerBuilder FindConfigureContainerDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Typ: startupType, String environmentName)
        {
            var configureMethod = FindMethod(startupType, "Configure{0}Container", environmentName, typeof(void), erforderlich: false);
            den neuen ConfigureContainerBuilder (configureMethod) zurückgeben;
        }
Suchen Sie nach der Konfigurationsmethode

configureBuilder = StartupLoader.FindConfigureDelegate(startupType, context. HostingEnvironment.EnvironmentName);

interne statische ConfigureBuilder FindConfigureDelegate([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Geben Sie startupType, String-environmentName)
{
    var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), erforderlich: true)!;
    gibt neuen ConfigureBuilder (configureMethod) zurück;
}
Der Quellcode, der mit der Build-Methode von ConfigureBuilder aufgerufen wird, ist wie folgt:

Privatklasse ConfigureBuilder
        {
            public ConfigureBuilder(MethodInfo configure)
            {
                MethodInfo = konfigurieren;
            }

            public MethodInfo MethodInfo { get; }

            public<IApplicationBuilder> Action Build (Objektinstanz)
            {
                return (applicationBuilder) => Invoke (instance, applicationBuilder);
            }

            private void Invoke (Objektinstanz, IApplicationBuilder builder)
            {
                var serviceProvider = builder. ApplicationServices;
                var parameterInfos = MethodInfo.GetParameters();
                var parameters = neues Objekt[parameterInfos.Length];
                für (Var-Index = 0; Index < parameterInfos.Length; index++)
                {
                    var parameterInfo = parameterInfos[index];
                    wenn (parameterInfo.ParameterType == typeof(IApplicationBuilder))
                    {
                        Parameter[index] = Erbauer;
                    }
                    oder
                    {
                        Versuch es
                        {
                            parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType);
                        }
                        catch (Ausnahme z. B.)
                        {
                            neue InvalidOperationException(
                                Resources.FormatMiddlewareFilter_ServiceResolutionFail(
                                    parameterInfo.ParameterType.FullName,
                                    parameterInfo.Name,
                                    MethodInfo.Name,
                                    MethodInfo.DeclaringType.FullName),
                                z.B.);
                        }
                    }
                }
                MethodInfo.Invoke (Instanz, Parameter);
            }
        }
Run-Methode

Adresse der HostingAbstractionsHostExtensions-Erweiterungsmethode:

Der Hyperlink-Login ist sichtbar.


Schließlich ruft er an:

/// <summary>
        Führt eine Anwendung aus und gibt eine Aufgabe zurück, die nur abgeschlossen wird, wenn das Token ausgelöst oder das Herunterfahren ausgelöst wird.
        /// </summary>
        <param name="host">Die <siehe cref="IHost"/> zu laufen.</param>
        <param name="token">Der Token zum Auslösen des Shutdowns.</param>
        <returns>Das <siehe cref="Task"/>, das die asynchrone Operation darstellt.</returns>
        öffentlich statisch asynchron Task RunAsync (dieser IHost-Host, CancellationToken = Standard)
        {
            Versuch es
            {
                Warte auf den Gastgeber. StartAsync (Token). ConfigureAwait (falsch);

                Warte auf den Gastgeber. WaitForShutdownAsync(Token). ConfigureAwait (falsch);
            }
            Endlich
            {
                if (Host ist IAsyncDisposable asyncDisposable)
                {
                    await asyncDisposable.DisposeAsync(). ConfigureAwait (falsch);
                }
                oder
                {
                    Host. Entsorgen();
                }

            }
        }
Früher, als ich einen Dienst gebaut habe, habe ich mich für den IHost-Dienst registriert, und der Code lautet wie folgt:

Dienstleistungen. AddSingleton<IHost>(_ =>
            {
                neue Interne.Host(_appServices zurückgeben,
                    _appServices.GetRequiredService<IHostApplicationLifetime>(),
                    _appServices.GetRequiredService<ILogger<Internal.Host>>(),
                    _appServices.GetRequiredService<IHostLifetime>(),
                    _appServices.GetRequiredService<IOptions<HostOptions>>());
            });
StartAsync-Methode

Adresse:Der Hyperlink-Login ist sichtbar.

public async Task StartAsync(CancellationToken cancellationToken = default)
        {
            _logger. Start();

            using var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _applicationLifetime.ApplicationStopping);
            CancellationToken combinedCancellationToken = combinedCancellationTokenSource.Token;

            warten _hostLifetime.WartenForStartAsync(kombinierteCancellationToken). ConfigureAwait (falsch);

            combinedCancellationToken.ThrowIfCancellationRequested();
            _hostedServices = Services.GetService<IEnumerable<IHostedService>>();

            foreach (IHostedService hostete Service in _hostedServices)
            {
                Feuer IHostedService.Start
                await hostedService.StartAsync (combinedCancellationToken). ConfigureAwait (falsch);

                if (hostedService ist BackgroundService backgroundService)
                {
                    _ = HandleBackgroundException (backgroundService);
                }
            }

            Feuer IHostApplicationLifetime. Gestartet
            _applicationLifetime.NotifyStarted();

            _logger. Gestartet();
        }
(Ende)




Vorhergehend:Späte Neuankömmlinge berichten
Nächster:.NET Core-Fehler im Linux-Fehlerverarbeitungs-Anwendungsbundle
Veröffentlicht am 22.9.2021, 20:45:12 |
Lerne zu lernen...
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com