VS 2015 是否使用 Kestrel?

Does VS 2015 use Kestrel?

我正在使用 VS 2015 Update3。 我有 ASP.NET 核心网站 api 和以下 Program.cs 代码

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

然后我使用 Visual Studio 按 F5 进入 运行 应用程序。当我向 API 发出请求时,我得到了结果,所以一切正常。
在 Program.cs 我有 .UseIISIntegration()。因此,当请求到达 IIS Express 时,我印象深刻,它只是将该请求转发给 Kestrel。 所以我认为 IIS Express 和 Kestrel 都必须在 2 个不同的端口上同时 运行。

然而,当我使用 运行 netstat -ab 命令时,我注意到 IIS express 按预期在端口 40000 上 运行ning,但在端口 [=15= 上没有 运行ning ].实际上只是为了测试我将 IIS Express 端口也更改为 5000 并且它工作正常。我原以为 IIS Express 和 Kestrel 之间会发生冲突,但那并没有发生。

所以问题是 VS 2015 是否完全使用 Kestrel?

VisualStudio 确实使用了 Kestrel。诀窍在于,当在 IIS/IISExpress 后面使用 Kestrel 时,它不会使用您指定的端口。相反,IIS 选择一个随机端口用于通信,这是 Kestrel 必须使用的端口(该端口在 UseIISIntegration 中被覆盖)。如果你是 运行 Kestrel 直接 .UseIISIntegration 只是一个空操作,因此 Kestrel 将监听你在 UseUrls 中指定的端口。这样做的后果之一是 .UseUrls.UseIISIntegration 的顺序很重要——如果你把 .UseUrls 放在 .UseIISIntegration 之后,你总是会覆盖端口,结果你会无法使用 IIS 启动您的应用程序。 如果您想确切了解正在发生的事情,请查看我写的关于这个主题的 blog post