Webserver-implementaties in ASP.NET Core
Notitie
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikelvoor de huidige release.
Door Tom Dykstra, Steve Smith, Stephen Halteren Chris Ross
Een ASP.NET Core-app wordt uitgevoerd met een in-process HTTP-server-implementatie. De server-implementatie luistert naar HTTP-aanvragen en maakt deze aanvragen toegankelijk voor de app als een set aanvraagfuncties samengesteld in een HttpContext.
ASP.NET Core wordt geleverd met het volgende:
- Kestrel server is de standaard, platformoverschrijdende IMPLEMENTATIE van HTTP-servers. Kestrel biedt de beste prestaties en het geheugengebruik, maar er zijn geen enkele van de geavanceerde functies in HTTP.sys. Zie Kestrel versus HTTP.sys op het tabblad Windows voor meer informatie.
- IIS HTTP-server is een processerver voor IIS.
- HTTP.sys server is een alleen-Windows HTTP-server op basis van het HTTP.sys kernelstuurprogramma en HTTP Server-API-.
Wanneer u IIS- of IIS Express-gebruikt, wordt de app op de volgende manieren uitgevoerd:
- In hetzelfde proces als het IIS-werkproces (het in-process hostingmodel) met de IIS HTTP-server. In-Process is de aanbevolen configuratie.
- In een proces gescheiden van het IIS-werkproces (het out of process hostingmodel) met de Kestrel-server.
De ASP.NET Core Module is een systeemeigen IIS-module waarmee systeemeigen IIS-aanvragen worden verwerkt tussen IIS en de in-process IIS HTTP-server of Kestrel. Zie ASP.NET Core Module (ANCM) voor IIS-voor meer informatie.
Kestrel versus HTTP.sys
Kestrel heeft de volgende voordelen ten opzichte van HTTP.sys:
- Betere prestaties en geheugengebruik.
- Platformoverschrijdend
- Flexibiliteit, het is ontwikkeld en gepatcht onafhankelijk van het besturingssysteem.
- Programmatische poort en TLS-configuratie
- Uitbreidbaarheid waarmee protocollen zoals PPv2- en alternatieve transporten mogelijk zijn.
Http.Sys werkt als een gedeeld kernelmodusonderdeel met de volgende functies die kestrel niet heeft:
- Poort delen
- Windows-verificatie in kernelmodus. Kestrel ondersteunt alleen verificatie in de gebruikersmodus.
- Snelle proxy's via wachtrijoverdrachten
- Directe bestandsoverdracht
- Antwoordcaching
Hostingmodellen
Er zijn verschillende hostingmodellen beschikbaar:
Kestrel zelfhosting: de Kestrel webserver wordt uitgevoerd zonder dat hiervoor andere externe webservers zoals IIS of HTTP.sysnodig zijn.
HTTP.sys zelfhosting is een alternatief voor Kestrel. Kestrel wordt aanbevolen via HTTP.sys, tenzij voor de app functies zijn vereist die niet beschikbaar zijn in Kestrel.
IIS in-process hosting: een ASP.NET Core-app wordt uitgevoerd in hetzelfde proces als het IIS-werkproces. IIS in-process hosting biedt verbeterde prestaties ten opzichte van IIS out-of-process hosting, omdat aanvragen niet geproxied hoeven te worden via de loopback-adapter, een netwerkinterface die uitgaand netwerkverkeer retourneert naar dezelfde computer. IIS verwerkt procesbeheer met de WAS-(Windows Process Activation Service).
Out-of-process-hosting van IIS: ASP.NET Core-apps worden uitgevoerd in een proces gescheiden van het IIS-werkproces, en de module beheert het procesbeheer. De module start het proces voor de ASP.NET Core-app wanneer de eerste aanvraag binnenkomt en start de app opnieuw als deze wordt afgesloten of vastloopt. Dit is in wezen hetzelfde gedrag als bij apps die in het proces worden uitgevoerd die worden beheerd door de WAS-(Windows Process Activation Service). Als u een afzonderlijk proces gebruikt, kunt u ook meerdere apps hosten vanuit dezelfde app-pool.
Zie het volgende voor meer informatie:
Kestrel
Kestrel server is de standaard, platformoverschrijdende IMPLEMENTATIE van HTTP-servers. Kestrel biedt de beste prestaties en het geheugengebruik, maar er zijn geen enkele van de geavanceerde functies in HTTP.sys. Zie Kestrel versus HTTP.sys in dit document voor meer informatie.
Gebruik Kestrel:
Op zichzelf als een edge-server verwerken aanvragen rechtstreeks vanuit een netwerk, inclusief internet.
Met een omgekeerde proxyserver, zoals Internet Information Services (IIS), Nginxof Apache. Een omgekeerde proxyserver ontvangt HTTP-aanvragen van internet en stuurt deze door naar Kestrel.
Hostingconfiguratie, met of zonder een omgekeerde proxyserver, wordt ondersteund.
Zie Kestrel webserver in ASP.NET Corevoor Kestrel configuratierichtlijnen en informatie over het gebruik van Kestrel in een omgekeerde proxyconfiguratie.
ASP.NET Core wordt geleverd met het volgende:
- Kestrel server is de standaard, platformoverschrijdende HTTP-server.
- HTTP.sys server is een alleen-Windows HTTP-server op basis van het HTTP.sys kernelstuurprogramma en HTTP Server-API-.
Wanneer u IIS- of IIS Express-gebruikt, wordt de app uitgevoerd in een proces gescheiden van het IIS-werkproces (out-of-process) met de Kestrel-server.
Omdat ASP.NET Core-apps worden uitgevoerd in een proces dat losstaat van het IIS-werkproces, verwerkt de module procesbeheer. De module start het proces voor de ASP.NET Core-app wanneer de eerste aanvraag binnenkomt en start de app opnieuw als deze wordt afgesloten of vastloopt. Dit is in wezen hetzelfde gedrag als bij apps die in het proces worden uitgevoerd die worden beheerd door de WAS-(Windows Process Activation Service).
In het volgende diagram ziet u de relatie tussen IIS, de ASP.NET Core Module en een app die out-of-process wordt gehost:
Aanvragen komen van het web naar het kernel-modus HTTP.sys stuurprogramma. Het stuurprogramma stuurt de aanvragen naar IIS op de geconfigureerde poort van de website, meestal 80 (HTTP) of 443 (HTTPS). De module stuurt de aanvragen door naar Kestrel op een willekeurige poort voor de app, die geen poort 80 of 443 is.
De module specificeert de poort via een omgevingsvariabele bij het opstarten en de IIS Integration Middleware configureert de server om te luisteren op http://localhost:{port}
. Aanvullende controles worden uitgevoerd en aanvragen die niet afkomstig zijn van de module, worden geweigerd. De module biedt geen ondersteuning voor HTTPS-doorsturen, dus aanvragen worden doorgestuurd via HTTP, zelfs niet als deze worden ontvangen door IIS via HTTPS.
Nadat Kestrel de aanvraag uit de module heeft opgehaald, wordt de aanvraag naar de ASP.NET Core middleware-pijplijn gepusht. De middleware-pijplijn verwerkt de aanvraag en geeft deze als een HttpContext
exemplaar door aan de logica van de app. Middleware die door IIS-integratie is toegevoegd, werkt het schema, externe IP en pathbase bij voor het doorsturen van de aanvraag naar Kestrel. Het antwoord van de app wordt teruggegeven aan IIS, waardoor deze terug wordt gepusht naar de HTTP-client die de aanvraag heeft gestart.
Zie de volgende onderwerpen voor IIS- en ASP.NET Core Module-configuratierichtlijnen:
Nginx met Kestrel
Zie Host ASP.NET Core op Linux met Nginx-voor informatie over het gebruik van Nginx op Linux als een omgekeerde proxyserver voor Kestrel.
HTTP.sys
Als ASP.NET Core-apps worden uitgevoerd in Windows, is HTTP.sys een alternatief voor Kestrel. Kestrel wordt aanbevolen via HTTP.sys, tenzij voor de app functies zijn vereist die niet beschikbaar zijn in Kestrel. Zie HTTP.sys webserver-implementatie in ASP.NET Corevoor meer informatie.
HTTP.sys kan ook worden gebruikt voor apps die alleen beschikbaar zijn voor een intern netwerk.
Zie HTTP.sys webserver-implementatie in ASP.NET Corevoor HTTP.sys configuratierichtlijnen.
ASP.NET Core-serverinfrastructuur
De IApplicationBuilder die beschikbaar is in de methode Startup.Configure
maakt de eigenschap ServerFeatures van het type IFeatureCollectionbeschikbaar.
Kestrel en HTTP.sys slechts één functie beschikbaar maken, IServerAddressesFeature, maar verschillende server-implementaties kunnen extra functionaliteit bieden.
IServerAddressesFeature
kan worden gebruikt om te achterhalen welke poort de server-implementatie tijdens runtime heeft gebonden.
Aangepaste servers
Als de ingebouwde servers niet voldoen aan de vereisten van de app, kan er een aangepaste server-implementatie worden gemaakt. De handleiding Open Web Interface for .NET (OWIN) laat zien hoe u een op Nowingebaseerde IServer-implementatie schrijft. Alleen de functie-interfaces die door de app worden gebruikt, vereisen implementatie, hoewel minimaal IHttpRequestFeature en IHttpResponseFeature moeten worden ondersteund.
Server opstarten
De server wordt gestart wanneer de geïntegreerde ontwikkelomgeving (IDE) of editor de app start.
- Visual Studio: Startprofielen kunnen worden gebruikt om de app en server te starten met IIS Express/ASP.NET Core Module of de console.
- Visual Studio Code: de app en server worden gestart door Omnisharp-, waarmee het CoreCLR-foutopsporingsprogramma wordt geactiveerd.
- Visual Studio voor Mac: de app en server worden gestart door de Mono Soft-Mode Debugger.
Wanneer u de app start vanaf een opdrachtprompt in de map van het project, start dotnet-uitvoering de app en server (alleenKestrel en HTTP.sys). De configuratie wordt opgegeven door de optie -c|--configuration
, die is ingesteld op Debug
(standaard) of Release
.
Een launchSettings.json
-bestand biedt configuratie bij het starten van een app met dotnet run
of met een foutopsporingsprogramma dat is ingebouwd in hulpprogramma's, zoals Visual Studio. Als startprofielen aanwezig zijn in een launchSettings.json
bestand, gebruikt u de optie --launch-profile {PROFILE NAME}
met de opdracht dotnet run
of selecteert u het profiel in Visual Studio. Voor meer informatie, zie dotnet run en .NET Core-distributieverpakkingen.
HTTP/2-ondersteuning
HTTP/2- wordt ondersteund met ASP.NET Core in de volgende implementatiescenario's:
- Kestrel
- Besturingssysteem
- Windows Server 2016/Windows 10 of hoger†
- Linux met OpenSSL 1.0.2 of hoger (bijvoorbeeld Ubuntu 16.04 of hoger)
- macOS 10.15 of hoger
- Doelframework: .NET Core 2.2 of hoger
- Besturingssysteem
-
HTTP.sys
- Windows Server 2016/Windows 10 of hoger
- Doelframework: niet van toepassing op HTTP.sys implementaties.
-
IIS (in-proces)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Doelframework: .NET Core 2.2 of hoger
-
IIS- (niet verwerkt)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Openbare edge-serververbindingen maken gebruik van HTTP/2, maar de omgekeerde proxyverbinding met Kestrel maakt gebruik van HTTP/1.1.
- Doelframework: Niet van toepassing op out-of-process-implementaties van IIS.
†Kestrel heeft beperkte ondersteuning voor HTTP/2 op Windows Server 2012 R2 en Windows 8.1. Ondersteuning is beperkt omdat de lijst met ondersteunde TLS-coderingssuites die beschikbaar zijn op deze besturingssystemen, beperkt is. Een certificaat dat wordt gegenereerd met behulp van een Elliptic Curve Digital Signature Algorithm (ECDSA) is mogelijk vereist om TLS-verbindingen te beveiligen.
- Kestrel
- Besturingssysteem
- Windows Server 2016/Windows 10 of hoger†
- Linux met OpenSSL 1.0.2 of hoger (bijvoorbeeld Ubuntu 16.04 of hoger)
- HTTP/2 wordt ondersteund in macOS in een toekomstige release.
- Doelframework: .NET Core 2.2 of hoger
- Besturingssysteem
-
HTTP.sys
- Windows Server 2016/Windows 10 of hoger
- Doelframework: niet van toepassing op HTTP.sys implementaties.
-
IIS (in-proces)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Doelframework: .NET Core 2.2 of hoger
-
IIS (out-of-process) -> IIS (buiten het proces)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Openbare edge-serververbindingen maken gebruik van HTTP/2, maar de omgekeerde proxyverbinding met Kestrel maakt gebruik van HTTP/1.1.
- Doelframework: Niet van toepassing op out-of-process-implementaties van IIS.
†Kestrel heeft beperkte ondersteuning voor HTTP/2 op Windows Server 2012 R2 en Windows 8.1. Ondersteuning is beperkt omdat de lijst met ondersteunde TLS-coderingssuites die beschikbaar zijn op deze besturingssystemen, beperkt is. Een certificaat dat wordt gegenereerd met behulp van een Elliptic Curve Digital Signature Algorithm (ECDSA) is mogelijk vereist om TLS-verbindingen te beveiligen.
- Kestrel
- Besturingssysteem
- Windows Server 2016/Windows 10 of hoger†
- Linux met OpenSSL 1.0.2 of hoger (bijvoorbeeld Ubuntu 16.04 of hoger)
- HTTP/2 wordt ondersteund in macOS in een toekomstige release.
- Doelframework: .NET Core 2.2 of hoger
- Besturingssysteem
-
HTTP.sys
- Windows Server 2016/Windows 10 of hoger
- Doelframework: niet van toepassing op HTTP.sys implementaties.
-
IIS (in-proces)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Doelframework: .NET Core 2.2 of hoger
-
IIS- (niet verwerkt)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Openbare edge-serververbindingen maken gebruik van HTTP/2, maar de omgekeerde proxyverbinding met Kestrel maakt gebruik van HTTP/1.1.
- Doelframework: Niet van toepassing op out-of-process-implementaties van IIS.
†Kestrel heeft beperkte ondersteuning voor HTTP/2 op Windows Server 2012 R2 en Windows 8.1. Ondersteuning is beperkt omdat de lijst met ondersteunde TLS-coderingssuites die beschikbaar zijn op deze besturingssystemen, beperkt is. Een certificaat dat wordt gegenereerd met behulp van een Elliptic Curve Digital Signature Algorithm (ECDSA) is mogelijk vereist om TLS-verbindingen te beveiligen.
-
HTTP.sys
- Windows Server 2016/Windows 10 of hoger
- Doelframework: niet van toepassing op HTTP.sys implementaties.
-
IIS- (niet verwerkt)
- Windows Server 2016/Windows 10 of hoger; IIS 10 of hoger
- Openbare edge-serververbindingen maken gebruik van HTTP/2, maar de omgekeerde proxyverbinding met Kestrel maakt gebruik van HTTP/1.1.
- Doelframework: Niet van toepassing op out-of-process-implementaties van IIS.
Een HTTP/2-verbinding moet gebruikmaken van Application-Layer ALPN- en TLS 1.2 of hoger. Zie de onderwerpen die betrekking hebben op uw serverimplementatiescenario's voor meer informatie.
Patronen voor bedrijfsweb-apps
Zie Enterprise-web-app-patronenvoor hulp bij het maken van een betrouwbare, veilige, uitvoerbare, testbare en schaalbare ASP.NET Core-app. Er is een volledige voorbeeldweb-app van productiekwaliteit beschikbaar waarmee de patronen worden geïmplementeerd.