我有ASP.NET核心Web应用程序。我已在Web服务器上配置了Web应用程序,并将ASPNETCORE_ENVIRONMENT
变量设置为Development
。我将此变量设置为机器级别,如下图所示。
现在在同一台机器上,我想配置一个与Staging
环境相同的Web应用程序实例。
我有什么选择在应用程序级别而不是机器级别设置ASPNETCORE_ENVIRONMENT
?所以我可以在同一台机器上托管同一个应用程序的多个实例?
答案 0 :(得分:18)
你有几个选择。
以不同的用户身份运行每个应用,并在该用户个人资料中设置环境变量。这为您提供了额外的安全奖励。您必须设置应用程序池才能加载用户个人资料。
使用IIS配置
答案 1 :(得分:2)
您可以更改在Web服务器上运行的代码解析配置吗?这就是我建议做的事情。这样您就可以在Windows设置中更自然地配置环境。
虽然配置IHostingEnvironment.EnvironmentName
变量的传统方法是通过ASPNETCORE_ENVIRONMENT
环境变量完成,但您可以更改ASP.NET Core解析其配置的方式,以便您可以通过命令行参数。
详细说明...
默认情况下,Program.cs
命令发出的dotnet new -t web
文件如下所示:
public static void Main(string[] args) {
var host = new WebHostBuilder()
.UseKestrel()
.UseUrls("http://0.0.0.0:5000")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
这使得ASP.NET Core使用the default configuration processing (environment variables with a ASPNETCORE_
prefix)来确定IHostingEnvironment.EnvironmentName
的值,您将使用它来配置应用程序的运行方式。
幸运的是,您可以使用UseConfiguration()
extension method on WebHostBuilder
更改ASP.NET Core解析配置的方式。以下是使用默认实现的自定义配置的示例:
public static void Main(string[] args) {
var configuration =
new ConfigurationBuilder()
.AddEnvironmentVariables("ASPNETCORE_")
.Build();
var host =
new WebHostBuilder()
.UseConfiguration(configuration)
.UseKestrel()
.UseUrls("http://0.0.0.0:5000")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
从这里开始,我会更改它,因此除了ASPNETCORE_
前缀环境变量之外,它还可以使用命令行。这将允许您使用您想要的任何环境名称轻松运行您的应用程序,如下所示:
public static void Main(string[] args) {
var configuration =
new ConfigurationBuilder()
.AddEnvironmentVariables("ASPNETCORE_")
.AddCommandLine(args)
.Build();
var host =
new WebHostBuilder()
.UseConfiguration(configuration)
.UseKestrel()
.UseUrls("http://0.0.0.0:5000")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
然后,当您使用dotnet run
启动dotnet核心应用程序时,可以在命令行上设置环境,如下所示:
dotnet run environment=development
dotnet run environment=staging
现在仍然会尊重ASPNETCORE_ENVIRONMENT
环境变量,但是在进行本地开发时可以通过命令行覆盖它。请注意,如果您尚未使用Microsoft.Extensions.Configuration.CommandLine
扩展方法,则需要在project.json
文件中加入AddCommandLine()
nuget包。