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。
我正在使用 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。