VS 2015使用Kestrel吗?

时间:2016-09-02 15:54:44

标签: asp.net-core asp.net-core-1.0 coreclr kestrel-http-server

我正在使用VS 2015 Update3。 我有ASP.NET核心web 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"
      }
    }
  }
}

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

但是当我运行netstat -ab命令时,我注意到IIS Express正在按预期在端口40000上运行,但端口5000上没有运行任何内容。实际上只是为了测试我将IIS Express端口也更改为5000并且它工作正常。我期待IIS Express和Kestrel之间发生冲突,但这种情况并没有发生。

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

1 个答案:

答案 0 :(得分:2)

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