看起来随着ASP.NET Core 2.1的推出,Kestrel现在自动创建一个HTTPS端点和HTTP端点,而默认的项目模板将被设置为从HTTP重定向到HTTPS(这很容易撤销)。
然而我的问题是......我如何完全禁用项目中的HTTPS。我已经阅读了文档并尝试了各种HTTPS配置设置,但我所做的一切似乎都无法让我关闭HTTPS并运行一个HTTP项目。
我是疯了还是漏了什么?我希望这很容易做到。
看起来随着ASP.NET Core 2.1的推出,Kestrel现在自动创建一个HTTPS端点和HTTP端点,而默认的项目模板将被设置为从HTTP重定向到HTTPS(这很容易撤销)。
然而我的问题是......我如何完全禁用项目中的HTTPS。我已经阅读了文档并尝试了各种HTTPS配置设置,但我所做的一切似乎都无法让我关闭HTTPS并运行一个HTTP项目。
我是疯了还是漏了什么?我希望这很容易做到。
在 Startup.cs 中删除中间件
app.UseHttpsRedirection();
如果您正在使用Visual Studio 2017,则可以执行以下操作:
这将更新launchSettings.json文件中的iisExpress设置。
Properties/launchSettings.json
中,查找键applicationUrl
。你会发现类似以下内容:...
"applicationUrl": "https://localhost:5001;http://localhost:5000",
...
删除https
端点即可完成。
编辑
如@Xorcist所指出的那样,文件launchSettings.json
未发布。因此,上述解决方案仅适用于开发环境。要禁用https,并在生产和开发中通用地配置要监听的URL,您还可以执行以下操作之一:
使用dotnet run --urls=http://0.0.0.0:5000,https://0.0.0.0:5001
参数可以达到与launchSettings.json
中的applicationUrl
相同的效果。再次强调,删除不需要使用的选项。
同样可以通过设置ASPNETCORE_URLS
环境变量来实现。
正如@Konstantin在这个问题的答案中提到的,ASP Net Core 2.1还可以在appsettings.json
中配置Kestrel终结点(在2.0中似乎无法完成)。
最后,也可以使用useUrls
扩展方法WebHost.CreateDefaultBuilder(args).UseUrls("http://0.0.0.0:5000")
达到相同的效果。我更喜欢前面的解决方案,因为这种方式会硬编码你的应用程序终结点,无法在不重新编译应用程序的情况下更改。
所有可能的选项都在Microsoft Docs on this中详细说明。
更新(2020年12月9日):根据微软文档,这些选项仍然适用于 .NET Core 3.1,除了 appsettings。也许它仍然有效,但我不确定。 更新(2021年5月19日):根据微软文档,这些选项仍然适用于 .NET 5,除了 appsettings。也许它仍然有效,但我不确定。launchSettings.json
不被发布的事实,这也是正确的,但在生产环境中,您可能希望默认启用 https。无论如何,我将更新我的答案并提供其他选项。 - joanlofe结果发现我想要做的正确方法是使用.UseKestrel()来具体配置Kestrel,并且简单地指定一个地址,就像这样:
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options => {
if (context.Configuration[WebHostDefaults.EnvironmentKey] == Environments.Development) {
options.Listen(IPAddress.Loopback, 5080); //HTTP port
}
})
.UseStartup<Startup>();
实际上是覆盖了默认设置,当 Kestel 开始时会显示此警告:
warn: Microsoft.AspNetCore.Server.Kestrel[0]
Overriding address(es) 'https://localhost:5001, http://localhost:5000'. Binding to endpoints defined in UseKestrel() instead.
请注意检查开发环境;在生产环境中,端口默认为不同的端口(80),且没有HTTPS。
如果指定了第二个地址,则假定该地址将受到内置开发人员证书的保护,因此:
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options => {
options.Listen(IPAddress.Loopback, 5080); //HTTP port
options.Listen(IPAddress.Loopback, 5443); //HTTPS port
})
.UseStartup<Startup>();
您当然可以按照此处描述的方法,专门保护您的SSL地址:
这对于生产设置是必要的。
{ "urls": "http://localhost:5080" }
program.cs (main)public static void Main(string[] args) { IConfigurationRoot config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("hosting.json") .AddCommandLine(args) .Build(); CreateWebHostBuilder(args).UseConfiguration(config).Build().Run(); }
- XorcistWebHost.CreateDefaultBuilder(args)
.UseUrls("http://localhost:5000")
.UseStartup<Startup>();
在Startup.cs中删除/注释以下内容:
app.UseHttpsRedirection();
dotnet
CLI现在有一个针对此的模板。
dotnet new webapi --no-https
关闭https 只需要进行以下三个更改...
Properties/launchSettings.json
Startup.cs
使用 ASP.NET CORE 2.2,只需将 Web 服务器 URL 设置为 http 而不是 https,它会自动识别。您可以将其作为自托管进程运行。
如果使用Docker,禁用https的另一种方法是非常方便的。在Dockerfile中设置环境变量,将其值设置为仅含一个HTTP网址。
#https + http
ENV ASPNETCORE_URLS=http://+:5001;http://+:5000
#http only
ENV ASPNETCORE_URLS=http://+:5000