一般来说,.NET Core Environment变量的区分大小写一直是个噩梦,特别是你开始使用.NET Core位运行Docker容器,现在我发现它再次变得丑陋,这里是一个dotnet发布输出截图:
以下是appsettings文件的源代码:
使用git我可以证明" D"在开发中确实是Windows文件名的大写:
现在这个问题也发生在appsettings.Production.json和appsettings.Staging.json上。这是间歇性的。有时情况会受到dotnet发布副本构建工件到其发布文件夹的尊重,但有时候它会为我的某些appsettings.json文件降低环境的第一个字母。
我可以删除发布文件夹以解决我在我的机器上进行开发时的问题,但是一旦我进入我的Linux构建服务器并且dotnet发布发生在完全干净的Linux平板上,在dotnet发布执行之前不存在发布文件夹我仍然间歇地得到同样的问题。
另外,只是想指出.NET Core IHostingEnvironment.IsDevelopment()
方法是区分大小写的,我无法相信,但是这样设置我的代码以忽略大小写更具挑战性,因为如果另一个开发人员信任IHostingEnvironment.IsDevelopment()
,那么这是一个常见的.NET Core约定:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.EnvironmentName.ToLower() == "localhost")
{
app.UseDeveloperExceptionPage();
}
app.UseServiceStack(new AppHost());
}
我至少可以这样做,以缓解此案例问题:
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName.ToLower()}.json", optional: true, reloadOnChange: true);
但是再次回顾一下.NET核心约定,环境区分大小写,这仍然留下了一个"漏洞"在计划中,对于我使用IHostingEnvironment.IsDevelopment()
答案 0 :(得分:2)
<tf.Tensor 'Conv2D_1:0' shape=(?, 16, 16, 1) dtype=float32>
只是一个字符串属性,它同时包含公共getter和setter。作为开发人员,您可以完全控制它包含的值。在大多数实际情况下,它只返回与ASPNETCORE_ENVIRONMENT变量中相同的值。
基于HostingEnvironmentExtensions.cs实施:
IHostingEnvironment.EnvironmentName
在内部使用相同的env.IsDevelopment
获取env名称,但是,将其与包含“Development”作为值的IHostingEnvironment.EnvironmentName
进行比较。
一般来说,您可以使用EnvironmentName.Development
方法获取预期的env名称作为第二个参数。
作为示例,以下代码生成不区分大小写的结果:
IHostingEnvironment.IsEnvironment
关于文件,您可以执行以下操作:
// IHostingEnvironment env;
env.EnvironmentName = env.EnvironmentName.ToLower();
var result = env.IsEnvironment(EnvironmentName.Development.ToLower());
修改您的代码,仅使用小写的env名称:
appsettings.production.json
答案 1 :(得分:-1)
我想提供我创建的EnvironmentHelper
课程,以便在我的所有API中协助解决此问题,以防其他人发现它有用:
public static class EnvironmentHelper
{
public static bool IsLocalhost(string env)
{
return IsEnvironment(env, EnvironmentName.Localhost);
}
public static bool IsDevelopment(string env)
{
return IsEnvironment(env, EnvironmentName.Development);
}
public static bool IsStaging(string env)
{
return IsEnvironment(env, EnvironmentName.Staging);
}
public static bool IsProduction(string env)
{
return IsEnvironment(env, EnvironmentName.Production);
}
private static bool IsEnvironment(string env, string environmentName)
{
return string.Equals(env, environmentName, StringComparison.CurrentCultureIgnoreCase);
}
}
public static class EnvironmentName
{
public static readonly string Localhost = "Localhost";
public static readonly string Development = "Development";
public static readonly string Staging = "Staging";
public static readonly string Production = "Production";
}