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