我正在研究如何在多种环境中正确处理环境变量和配置我的应用程序。我选择在开发中读取 config.json ,并在Production中使用环境变量。
我有以下 Startup.cs 来演示:
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.Extensions.Configuration;
namespace Variables
{
public class Startup
{
private IConfiguration mConfiguration;
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder();
if (env.IsDevelopment())
{
// Only load from config when in development.
builder.AddJsonFile("config.json");
}
builder.AddEnvironmentVariables();
mConfiguration = builder.Build();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseIISPlatformHandler();
app.UseDeveloperExceptionPage();
app.Run(async (context) =>
{
// Succeeds with hosting:environment=Development, fails with hosting:environment=Production
// ArgumentNullException: Value cannot be null. Parameter name: text
// Environment variable setup in Windows with:
// set bar=1
await context.Response.WriteAsync(mConfiguration["bar"]);
});
}
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}
}
我的 config.json 只是:
{
"bar": 1
}
以hosting:environment=Development
运行时成功。但是,当以hosting:environment=Production
运行时,这会失败。我在Windows中使用set bar=1
设置了一个环境变量。
我也尝试过使用系统环境变量(因为我不确定是否打开命令提示符并输入set bar=1
执行用户环境变量或系统变量),但它失败了运行我的应用程序时出错。
答案 0 :(得分:3)
config.json
{ "bar": 1 }
并使用此代码...
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder();
if (env.IsDevelopment())
{
builder.AddJsonFile("config.json");
}
builder.AddEnvironmentVariables();
mConfiguration = builder.Build();
}
public IConfigurationRoot mConfiguration { get; set; }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync(env.EnvironmentName);
await context.Response.WriteAsync($"\r\n");
await context.Response.WriteAsync(mConfiguration["bar"]);
await context.Response.WriteAsync($"\r\n");
});
}
public static void Main(string[] args) =>
Microsoft.AspNet.Hosting.WebApplication.Run<Startup>(args);
}
...运行以下命令......
CMD> dnvm use 1.0.0-rc1-update2
CMD> set bar=3
CMD> dnx web
...在网络浏览器中显示。
如果您使用的是Visual Studio,请在更改环境变量后重新启动它。或者,通过Visual Studio定义环境变量,这样您就不必重新启动。
重新启动你的shell。 dnx web
仅获取其shell中可用的环境变量。如果在其他地方定义环境变量后打开shell,则需要重新启动shell。
检查您的shell(PowerShell,命令提示符或bash)是否知道环境变量:
PS> $env:bar
CMD> SET bar
$ printenv bar
如果你的shell不知道环境变量,请按以下方式设置:
PS> $env:bar = 3
CMD> SET bar=3
$ export bar=3
转储您的应用知道的所有环境变量:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async (context) =>
{
foreach (var envVar in mConfiguration.GetChildren())
{
await context.Response.WriteAsync($"{envVar.Key}: {envVar.Value}");
await context.Response.WriteAsync($"\r\n");
}
});
}
检查您的应用是否在生产中运行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync(env.EnvironmentName);
await context.Response.WriteAsync($"\r\n");
});
}