.NET CORE-Startup

Die Hauptverantwortung des Hosts ist die Konfiguration des Webservers und der Aufbau von Pilpeline (Request Processing Pipeline).

Dieses Bild stellt einen allgemeinen Startvorgang dar. Aus dem obigen Bild wissen wir, dass der Start einer ASP.NET Core-Anwendung hauptsächlich drei Schritte umfasst:

  1. CreateDefaultBuilder(): IWebHostBuilder erstellen
  2. Build(): IWebHostBuilder ist für die Erstellung von IWebHost verantwortlich
  3. Run(): starte IWebHost

Daher besteht der Start der ASP.NET Core-Anwendung im Wesentlichen darin, das WebHost-Objekt als Host zu starten.
Es umfasst hauptsächlich zwei Schlüsselobjekte, IWebHostBuilder und IWebHost, deren interne Implementierung der Kern von ASP.NET Core-Anwendungen ist.
————————————————
Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des CSDN-Bloggers "kalvin_y_liu", gemäß der CC 4.0 BY-SA-Copyright-Vereinbarung, bitte fügen Sie den Originalquelllink und diesen hinzu Erklärung zum Nachdruck.
Ursprünglicher Link: https://blog.csdn.net/kalvin_y_liu/article/details/122796793

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen
Aus der obigen Abbildung können wir ersehen, dass die Methode CreateDefaultBuilder() hauptsächlich sechs wichtige Dinge tut:

  1. UseKestrel: Verwenden Sie Kestrel als Webserver.

  2. UseContentRoot: Gibt das Inhaltsstammverzeichnis (Inhaltsstammverzeichnis) an , das vom Webhost verwendet wird , z. B. Ansichten. Standardmäßig das Stammverzeichnis der aktuellen Anwendung.
  3. ConfigureAppConfiguration: Legt die aktuelle Anwendungskonfiguration fest. Lesen Sie hauptsächlich die Konfigurationsdatei appsettinggs.json
    , die in der Entwicklungsumgebung konfigurierten UserSecrets, fügen Sie Umgebungsvariablen und Befehlszeilenparameter hinzu.
  4. ConfigureLogging: Lesen Sie den Logging-Knoten in der Konfigurationsdatei und konfigurieren Sie das Logging-System.
  5. UseIISIntegration: IISIntegration-Middleware verwenden.
  6. UseDefaultServiceProvider: Legen Sie den standardmäßigen Abhängigkeitsinjektionscontainer fest.
  7. Nachdem der WebHostBuilder erstellt wurde, rufen Sie UseStartup() auf, um die Startklasse anzugeben, um einen Eintrag für die nachfolgende Dienstregistrierung und Middlewareregistrierung bereitzustellen.

————————————————
Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des CSDN-Bloggers "kalvin_y_liu", gemäß der CC 4.0 BY-SA-Copyright-Vereinbarung, bitte fügen Sie den Originalquelllink und diesen hinzu Erklärung zum Nachdruck.
Ursprünglicher Link: https://blog.csdn.net/kalvin_y_liu/article/details/122796793

Der Unterschied zwischen ConfigureServices und Configure in .NET Core

Die beiden ConfigureServices und Configure werden häufig in Startup verwendet.ConfigureServices
wird verwendet, um die Abhängigkeitsinjektion zu konfigurieren, um Objekte basierend auf Abhängigkeiten zur Laufzeit zu erstellen, und Configure wird verwendet, um Middleware zu konfigurieren, um Pipelines für die Anforderungsverarbeitung zu erstellen.

  • Diese Methode wird von der Laufzeit aufgerufen. Verwenden Sie diese Methode, um
    die HTTP-Anforderungspipeline zu konfigurieren
    . Verwenden Sie diese Methode, um die HTTP-Anforderungspipeline zu konfigurieren.
  • Diese Methode wird von der Laufzeit aufgerufen Verwenden Sie diese Methode, um
    Dienste zum Container hinzuzufügen
    . Verwenden Sie diese Methode, um einem Container einen Dienst hinzuzufügen.

Bildbeschreibung hier einfügen

Lebenszyklus

  • Dienste konfigurieren

ConfigureServices wird verwendet, um Dienste im DI-Container zu registrieren. Dieses Verfahren kann nicht implementiert werden, und es ist kein notwendiges Verfahren.

  • Configure
    ist eine notwendige Methode und muss implementiert werden. Die Parameter der Configure-Methode sind jedoch nicht festgelegt. Die Instanzen der Parameter werden alle vom WebHost injiziert, und die erforderlichen Parameter können je nach Bedarf erhöht oder verringert werden.
    IApplicationBuilder ist der wichtigste Parameter und ein notwendiger Parameter.Die Pipeline, die Request betritt und verlässt, wird durch ApplicationBuilder festgelegt.

Ich sehe diese beiden ConfigureServices und Configure oft, und ihre Verwendung ist immer unklar.Ich lese die offiziellen Microsoft-Dokumente unten und nehme sie auf und fasse sie noch einmal zusammen.

Einfach ausgedrückt
1.Konfigurieren Sie die Konfigurationsanforderungspipeline
2.ConfigureServices-Konfigurationsdienst
Bildbeschreibung hier einfügen

gemeinsame Konfiguration

1.Configure konfiguriert Middleware in der Anforderungspipeline

Nicht jede Middleware muss dieser genauen Reihenfolge folgen, aber viele tun es.
Beispielsweise müssen UseCors, UseAuthentication und UseAuthorization in der angezeigten Reihenfolge vorliegen.

》》Ausnahme-/Fehlerbehandlung
》》HTTPS-Umleitungs-Middleware (UseHttpsRedirection) leitet HTTP-Anforderungen an HTTPS um.
》》Middleware für statische Dateien (UseStaticFiles) gibt statische Dateien zurück und schließt die weitere Anforderungsverarbeitung kurz.
""Cookie-Richtlinien-Middleware (UseCookiePolicy) sorgt dafür, dass die Anwendung den Bestimmungen der EU-Datenschutz-Grundverordnung (DSGVO) entspricht.
"" Routing-Middleware (UseRouting)-Routing-Anforderungen.
>> Authentifizierungs-Middleware (UseAuthentication) versucht, Benutzer zu authentifizieren, bevor ihnen der Zugriff auf sichere Ressourcen gewährt wird.
》》Authorization Middleware (UseAuthorization) autorisiert Benutzer für den Zugriff auf sichere Ressourcen.
》》Session-Middleware (UseSession) richtet den Sitzungsstatus ein und hält ihn aufrecht. Wenn Ihre Anwendung den Sitzungsstatus verwendet, rufen Sie die Sitzungs-Middleware nach der Cookie-Richtlinien-Middleware und vor der MVC-Middleware auf.
>>Endpoint-Routing-Middleware (UseEndpoints with MapRazorPages) fügt Razor Pages-Endpunkte zur Anforderungspipeline hinzu.

2.ConfigureServices-Konfigurationsdienst
AddLocalization Lokalisierungsmethode hinzufügen
AddLogging Datensatzmethode hinzufügen
AddStackExchangeRedis Redis-Cache-Dienst hinzufügen
Wird verwendet, um die Abhängigkeitsinjektion zu konfigurieren (Definieren von Schnittstellen; Registrieren von Objekten durch Abhängigkeitsinjektions-Framework; Erstellen von Objekten durch Konstruktoren.) usw.
Hinweis:
ConfigureServices ist eine optionale Methode , Configure ist eine erforderliche Methode
Ausführungsreihenfolge: Führen Sie zuerst ConfigureServices aus, und führen Sie dann Configure aus

Middleware-Konzept

ASP.NET Core verwendet den Begriff Pipeline in der offiziellen Beschreibung von Middleware, was bedeutet, dass Middleware wie Wasserleitungen in Reihe geschaltet werden kann und alle Anforderungen und Antworten Schicht für Schicht durch diese Wasserleitungen geleitet werden.
Mit einer Legende lässt sich dies leicht nachvollziehen, wie in der folgenden Abbildung dargestellt:
Bildbeschreibung hier einfügen

VON Ioc

ASP.NET Core verwendet viel Dependency Injection (Dependency Injection, DI) und verwendet Inversion Of Control (IoC) ziemlich geschickt. DI kann als der wichtigste Teil von ASP.NET Core angesehen werden, und Sie sollten damit vertraut sein, wenn Sie Autofac oder ein ähnliches DI-Framework verwendet haben.
In diesem Artikel wird die Abhängigkeitsinjektion (Dependency Injection) von ASP.NET Core vorgestellt.

DI-Container-Einführung
Falls das DI-Framework nicht verwendet wird und angenommen wird, dass UserLogic in UserController aufgerufen werden soll, wird UserLogic wie folgt direkt in UserController instanziiert:

public class UserLogic {
    
    
    public void Create(User user) {
    
    
        // ...
    }
}
 
public class UserController : Controller {
    
    
    public void Register(User user){
    
    
        var logic = new UserLogic();
        logic.Create(user);
        // ...
    }
}

Mit dem oben genannten Programm gibt es im Grunde kein Problem, aber die Abhängigkeiten sind etwas schlimmer. UserController muss sich auf UserLogic verlassen, um ausgeführt zu werden, die Schnittstelle zu entfernen und sie zu ändern:

public interface IUserLogic {
    
    
    void Create(User user);
}
 
public class UserLogic : IUserLogic {
    
    
    public void Create(User user) {
    
    
        // ...
    }
}
 
public class UserController : Controller {
    
    
    private readonly IUserLogic _userLogic;
 
    public UserController() {
    
    
        _userLogic = new UserLogic();
    }
 
    public void Register(User user){
    
    
        _userLogic.Create(user);
        // ...
    }
}

Die Abhängigkeit zwischen UserController und UserLogic wird nur von Action auf die Konstruktionsmethode verschoben, und es ist immer noch eine starke Abhängigkeit.

ASP.NET Core schneidet diese Abhängigkeiten durch den DI-Container ab, die Instanz wird nicht auf der Benutzerseite generiert (bezogen auf die neue Bauweise im UserController im obigen Beispiel), sondern im DI-Container.
Die Registrierungsmethode des DI-Containers ist ebenfalls sehr einfach und wird in Startup.ConfigureServices registriert. folgendermaßen:

Startup.cs

// ...
public class Startup
{
    
    
    public void ConfigureServices(IServiceCollection services)
    {
    
    
        // ...
        services.AddScoped<ISample, Sample>();
    }
}

Der erste generische Typ ist ein injizierter Typ.
Es wird empfohlen, ihn mit Interface zu umschließen, damit die Abhängigkeit entfernt werden kann. Der zweite DI-Typ
, dessen generischer Typ eine Instanz ist, führt DI von ASP.NET Core aus und verwendet Constructor Injection, was bedeutet, dass das instanziierte Objekt vom Konstruktor übergeben wird. Wenn Sie auf die Objekte im DI-Container zugreifen möchten, fügen Sie einfach das entsprechende Interface zum Konstruktor hinzu. Zum Beispiel:


Controller\HomeController.cs

using Microsoft.AspNetCore.Mvc;
using MyWebsite.Models;
 
namespace MyWebsite.Controllers
{
    
    
    public class HomeController : Controller
    {
    
    
        private readonly ISample _sample;
 
        public HomeController(ISample sample)
        {
    
    
            _sample = sample;
        }
 
        public string Index()
        {
    
    
            return $"[ISample]\r\n"
                 + $"Id: {
      
      _sample.Id}\r\n"
                 + $"HashCode: {
      
      _sample.GetHashCode()}\r\n"
                 + $"Tpye: {
      
      _sample.GetType()}";
        }
    }
}

Wenn ASP.NET Core den Controller instanziiert, stellt es fest, dass es einen Parameter vom Typ ISample in der Konstruktionsmethode gibt, sodass es die Instanz von Sample in den Controller einfügt.

Jede Anforderung instanziiert den Controller, sodass der DI-Container die Instanz von ISample aus der Konstruktionsmethode einfügt, das Beispiel in der Variablen _sample speichert und sicherstellt, dass die Aktion die eingefügte ISample-Instanz verwenden kann.

Injizieren Sie den Instanzprozess, die Situation ist wie folgt:
Bildbeschreibung hier einfügen

Anwendungslebensdauer

Neben dem Einstiegspunkt des Programms stellen auch das Starten und Stoppen von WebHost einen sehr wichtigen Teil von Websiteereignissen dar. Im Gegensatz zu ASP.NET MVC erfasst ASP.NET Core Start- und Stoppereignisse auf geerbte Weise, fügt jedoch IApplicationLifetime durch Startup ein. Konfigurieren Sie, um dies auszugleichen.Erfassen Sie Start- und Stoppereignisse der Anwendung.

IApplicationLifetime verfügt über drei Registrierungsüberwachungsereignisse und Beendigungswebsiteereignisse, die ausgelöst werden können. folgendermaßen:

public interface IApplicationLifetime
{
    
    
  CancellationToken ApplicationStarted {
    
     get; }
  CancellationToken ApplicationStopping {
    
     get; }
  CancellationToken ApplicationStopped {
    
     get; }
  void StopApplication();
}

ApplicationStarted
Wenn der WebHost-Start abgeschlossen ist, wird das Startabschlussereignis ausgeführt.
ApplicationStopping
bereitet das Stoppen des Ereignisses vor, das ausgeführt wird, wenn der WebHost den Stopp auslöst.
ApplicationStopped
Wenn das WebHost-Stoppereignis abgeschlossen ist, wird das Stoppabschlussereignis ausgeführt.
StopApplication
kann über diese Methode aktiv die Beendigung der Website auslösen.
Lebenszyklus des Dienstes
Der im DI-Container registrierte Dienst hat drei Lebenszyklen:

Jedes Mal, wenn Transient
injiziert wird, wird eine neue Instanz neu erstellt.
Scoped
erstellt für jede Anfrage eine neue Instanz, und dieselbe Anfrage verwendet dieselbe Instanz, unabhängig davon, wie viele Pipelines sie durchläuft. Das obige Beispiel verwendet Scoped.
Nachdem das Singleton
instanziiert wurde, wird es nicht verschwinden, und es wird nur eine Instanz während der Ausführung des Programms geben.

Supongo que te gusta

Origin blog.csdn.net/kalvin_y_liu/article/details/129876616
Recomendado
Clasificación