2

Ich verwende VS 2015 Update3. Ich habe web api ASP.NET Kern mit dem folgenden Code Program.csVerwendet VS 2015 Kestrel?

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel()  
      .UseUrls("http://*:5000")   
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 

dann in VS I IIS Express konfiguriert haben auf Port 40000

Dies wird ausgeführt, wie launchSettings.json wie

sieht
{ 
    "iisSettings": { 
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": { 
     "applicationUrl": "http://localhost:40000/", 
     "sslPort": 0 
    } 
    }, 
    "profiles": { 
    "IIS Express": { 
     "commandName": "IISExpress", 
     "launchBrowser": true, 
     "launchUrl": "api/workunit", 
     "environmentVariables": { 
     "ASPNETCORE_ENVIRONMENT": "Development" 
     } 
    }, 
    "Api": { 
     "commandName": "Project", 
     "launchBrowser": true, 
     "launchUrl": "http://localhost:5000/api/values", 
     "environmentVariables": { 
     "ASPNETCORE_ENVIRONMENT": "Development" 
     } 
    } 
    } 
} 

Dann drücke ich F5, um App mit Visual Studio zu starten. Wenn ich eine Anfrage an API mache, bekomme ich das Ergebnis zurück, also funktioniert alles gut.
In Program.cs habe ich .UseIISIntegration(). So war ich unter Eindruck, wenn Anfrage zu IIS express kommt, leitet sie diese Anfrage nur an Kestrel weiter. Also ich dachte, IIS Express und Kestrel muss gleichzeitig auf 2 verschiedenen Ports laufen.

Allerdings, als ich lief netstat -ab Befehl Ich bemerkte, IIS Express läuft auf Port 40000 wie erwartet, aber nichts läuft auf Port 5000. In der Tat, nur um zu testen, änderte ich IIS Express-Port auch auf 5000 und es hat gut funktioniert. Ich habe einen Konflikt zwischen IIS Express und Kestrel erwartet, aber das ist nicht passiert.

Also Frage ist, verwendet VS 2015 Kestrel überhaupt?

Antwort

1

VisualStudio verwendet Kestrel. Der Trick besteht darin, dass Kestrel, wenn es hinter IIS/IISExpress verwendet wird, nicht den von Ihnen angegebenen Port verwendet. Stattdessen wählt IIS einen zufälligen Port, den er für die Kommunikation verwendet, und dies ist der Port, den Kestrel verwenden muss (der Port wird in der UseIISIntegration überschrieben). Wenn Sie Kestrel direkt ausführen, ist .UseIISIntegration nur ein No-Op und Kestrel wird daher auf den Port hören, den Sie in UseUrls angegeben haben. Eine der Konsequenzen davon ist, dass die Reihenfolge .UseUrls und .UseIISIntegration wichtig ist - wenn Sie .UseUrls nach .UseIISIntegration setzen, würden Sie den Port immer überschreiben und als Ergebnis würden Sie nicht in der Lage sein, Ihre Anwendung mit IIS zu starten. Wenn Sie genau das wollen, was passiert, werfen Sie einen Blick auf eine blog post Ich schrieb zu diesem Thema.