2

Я использую VS 2015 Update3. У меня есть ASP.NET Web API ядра со следующим кодом Program.csИспользует ли 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(); 
    } 
} 

Тогда в VS я настроил IIS Express для запуска на порт 40000

Это как launchSettings.json выглядит

{ 
    "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" 
     } 
    } 
    } 
} 

Затем я нажимаю F5 для запуска приложения с помощью Visual Studio. Когда я делаю запрос API, я получаю результат, поэтому все работает нормально.
В Program.cs у меня есть .UseIISIntegration(). Таким образом, я был под впечатлением, когда запрос поступает в IIS express, он просто передает этот запрос Kestrel. Итак, я думал, что IIS Express и Kestrel должны работать одновременно на двух разных портах.

Однако, когда я запустил команду netstat -ab, я заметил, что IIS express работает на порте 40000, как ожидалось, но ничего не работает на порту 5000. Фактически только для проверки я изменил порт IIS Express также на 5000, и он отлично работал. Я ожидал конфликта между IIS Express и Kestrel, но этого не произошло.

Вопрос в том, что VS 2015 использует Kestrel вообще?

ответ

1

VisualStudio использует Kestrel. Фокус в том, что, когда Kestrel используется за IIS/IISExpress, он не использует указанный вами порт. Скорее, IIS выбирает случайный порт, который он будет использовать для связи, и это порт Kestrel должен использоваться (порт переопределяется в UseIISIntegration). Если вы используете Kestrel напрямую .UseIISIntegration - это просто не-операционная система, поэтому Kestrel будет прослушивать порт, указанный вами в UseUrls. Одним из следствий этого является то, что порядок .UseUrls и .UseIISIntegration важен - если вы положили .UseUrls после .UseIISIntegration, вы всегда будете переопределять порт, и в результате вы не сможете запустить приложение с помощью IIS. Если вы хотите точно, что происходит, взгляните на blog post. Я написал на эту тему.