Che cos'è Kestrel (vs IIS / Express)


158

Che cos'è il server Web Kestrel e come si collega a IIS / IIS Express?

Vengo dallo sviluppo di app su IIS Express e dall'hosting su un server Web IIS. Con ASP.NET Core ho una dipendenza Microsoft.AspNetCore.Server.Kestrele il mio avvio ha .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Ma quando eseguo il mio sito Web, visualizzo ancora l'icona IIS Express nella barra delle applicazioni. Qualcuno mi ha chiesto se stavo usando IIS Express o Kestrel e non sapevo cosa dire!

Non ho requisiti multipiattaforma mentre sviluppo su un PC e host in Azure, quindi sono confuso se ho anche needKestrel, ma non sembra che ci sia un'alternativa - anche i campioni più semplici usano Kestrel.


Quando hai una domanda su questa nuova tecnologia, inizia dalla pagina GitHub per i progetti in questione e dai un'occhiata ai loro Wiki. Ti imbatteresti in questa pagina wiki Server per il repository ASP.NET.
muratore

11
Certo, allora ti imbatti in cose come This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. Ops.

Risposte:


115

Che cos'è il gheppio

È un web server completo. Puoi eseguire l'applicazione ASP.NET Core usando solo Kestrel.

Ma quando eseguo il mio sito Web, visualizzo ancora l'icona IIS Express nella barra delle applicazioni

Nell'applicazione ASP.NET, probabilmente nella wwwrootdirectory, vedrai un web.config che contiene questo:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
    <handlers>
    <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>

Questo è HttpPlatformHandler. In sostanza, ciò che fa è inoltrare tutte le richieste a Kestrel. IIS Express (e IIS del resto) non eseguiranno più ASP.NET. Invece, agiranno come proxy che semplicemente passano le richieste e le risposte avanti e indietro da Kestrel. Ci sono ancora vantaggi nell'usare IIS, in particolare ti dà la configurazione di sicurezza, la cache a livello di kernel, ecc.


5
eccellente introduzione a ciò che sta esattamente succedendo sotto le coperte quando si utilizza il core ASP.Net youtu.be/e2qZvabmSvo
user99513

4
Questa risposta è un po 'obsoleta a causa dell'introduzione del modulo principale ASP.NET (anziché di HttpPlatformHandler). Ho offerto una risposta alternativa con più storie e prodotti correlati.
Lex Li,

173

Vorrei offrire una risposta alternativa, con un po 'di storia, in modo che tu possa capire perché Kestrel arriva, anche se usi solo Windows e IIS.

All'inizio dello sviluppo di ASP.NET prima dell'anno 2000, chiaramente Microsoft ha creato due pezzi per ospitare le app Web.Forms ASP.NET,

  • Cassini, in seguito divenne ASP.NET Development Server in Visual Studio. È un server web completamente gestito scritto in C # basato su HttpListener. Naturalmente, poiché era solo per lo sviluppo, molte funzionalità non sono mai state implementate. Poiché Microsoft ha reso disponibile il codice sorgente di Cassini per il pubblico, ci sono terze parti che hanno biforcato la base di codice e aggiunto ulteriori funzionalità, dando vita alla famiglia Cassini.
  • Supporto ASP.NET su IIS (revisione 1). Poiché IIS era 4.0 e 5.0 / 5.1 in quel momento, che non ha nulla come i pool di applicazioni, ASP.NET ha persino il suo processo di lavoro ( aspnet_wp.exe).

Quindi per sviluppare un'app Web, usi Cassini e per distribuire usi IIS.

  • L'introduzione di pool di applicazioni in IIS 6 ha richiesto alcune modifiche sul lato ASP.NET, quindi è aspnet_wp.exediventato obsoleto e sostituito da aspnet_isapi.dll. Questo può essere visto come supporto ASP.NET sulla revisione IIS 2. Quindi le app ASP.NET sono ospitate nei processi di lavoro IIS w3wp.exe.

  • L'introduzione della pipeline integrata in IIS 7 e versioni successive ha richiesto ulteriori modifiche, che sono state sostituite aspnet_isapi.dllda webengine4.dll. Questo può essere visto come supporto ASP.NET sulla revisione IIS 3. Le pipeline ASP.NET e IIS sono unificate.

Puoi vedere ASP.NET che è diventato molto più complesso e strettamente integrato con IIS, quindi Cassini ha iniziato a mostrare la sua età e gradualmente è stato sostituito da IIS Express (IIS Lite in modalità utente).

Pertanto, in molti casi, quando le persone danno la colpa a IIS è lento, in realtà dovrebbero dare la colpa a ASP.NET. Lo stesso IIS senza ASP.NET è piuttosto veloce e stabile, mentre ASP.NET non è stato sviluppato tenendo conto delle metriche prestazionali sufficienti (poiché WebForms focalizza un sacco di produttività e RAD).

Quindi, nel novembre 2014, è stato annunciato ASP.NET 5 (in seguito ribattezzato ASP.NET Core) che è diventato una tecnologia multipiattaforma. Ovviamente Microsoft aveva bisogno di un nuovo design per supportare Windows, macOS e Linux, in cui tutti i principali server Web, nginx / Apache (o altri server Web) dovrebbero essere considerati oltre a IIS.

Penso che molti sarebbero d'accordo sul fatto che Microsoft abbia imparato molto da NodeJS, e quindi progettato e sviluppato Kestrel (basato libuvinizialmente ma potrebbe presto passare ad altre tecnologie). Inizialmente si tratta di un server Web leggero come Cassini, ma in seguito vengono aggiunte altre funzionalità (come un'altra risposta commentata, molte più funzionalità in modo che possano essere trattate come un server Web completo). Sebbene completamente gestito (esistono alcune dipendenze native), non è più un web server giocattolo come Cassini.

Allora perché non puoi semplicemente usare Kestrel? Perché IIS Express e potenzialmente IIS, nginx o Apache sono ancora necessari? Ciò è principalmente il risultato della pratica di Internet di oggi. La maggior parte dei siti Web utilizza proxy inversi per accettare le richieste dai browser Web e quindi inoltrarle ai server delle applicazioni in background.

  • IIS Express / IIS / nginx / Apache sono i server proxy inverso
  • Kestrel / NodeJS / Tomcat e così via sono i server delle applicazioni

Un'altra risposta ha già mostrato un collegamento alla documentazione di Microsoft, quindi puoi dare un'occhiata.

Microsoft ha sviluppato inizialmente HttpPlatformHandler per rendere IIS un proxy inverso abbastanza buono per Java / Python e così via, quindi ha pianificato di usarlo per ASP.NET Core. I problemi hanno iniziato a manifestarsi durante lo sviluppo, quindi in seguito Microsoft ha creato il modulo ASP.NET Core appositamente per ASP.NET Core. Questo è il supporto ASP.NET sulla revisione 4 di IIS.

A partire da ASP.NET Core 2.2, ASP.NET Core Module per IIS (versione 2) può ospitare l'ambiente .NET Core all'interno del processo di lavoro IIS ( w3wp.exe), abbastanza simile a ASP.NET 2.x / 4.x. Questa modalità è denominata "hosting in-process IIS" . Può essere considerato come supporto ASP.NET sulla revisione 5 di IIS.

Bene, piuttosto lungo, ma spero di aver messo insieme tutti i pezzi necessari e ti diverti a leggerlo.


1
Bella risposta. Ma non si può semplicemente dire che l'uso del gheppio con IIS è "il risultato della pratica di Internet di oggi". Esistono molte ragioni per utilizzare un proxy inverso. Sarebbe stato bello menzionarne alcuni qui.
Nilay Vishwakarma,

13
"Esistono molte ragioni per utilizzare un proxy inverso" appartiene alla propria domanda e risposta. Di solito le persone possono trovare buone risorse chiedendo a Google, quindi non l'ho aggiunto a questa risposta già abbastanza lunga.
Lex Li,

12

Dai documenti ms a: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel è un server Web multipiattaforma per ASP.NET Core basato su libuv, una libreria I / O asincrona multipiattaforma. Kestrel è il server Web incluso per impostazione predefinita nei modelli di progetto ASP.NET Core.

Puoi usare Kestrel da solo o con un server proxy inverso, come IIS, Nginx o Apache. Un server proxy inverso riceve richieste HTTP da Internet e le inoltra a Kestrel dopo una gestione preliminare.


AGGIORNAMENTO: .net core 2.1, Kestrel utilizza socket gestiti invece se libuv

Dai documenti 2.1 di asp.net core su: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

Con il rilascio di ASP.NET Core 2.1, il trasporto predefinito di Kestrel non è più basato su Libuv ma invece su socket gestiti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.