c# - 使用特定 appsettings 环境为 ASP.NET Core 部署 Azure Web App
问题描述
我正在将几个 Web 应用程序部署到 Azure:一个部署到开发/测试环境,一个部署到生产环境。
我尝试根据环境计算机名称确定要加载的 appsettings,因为我的理解是 Core 的不同之处在于您无法针对特定环境发布。我没有意识到 Azure 中的计算机名称发生了变化,因此当我今天早些时候尝试将较旧的应用程序部署到测试环境时,它开始使用生产设置。
public static void Main(string[] args)
{
string environmentName;
if (args.Length > 0)
{
environmentName = args[0];
if (environmentName != "Local" && environmentName != "Test" && environmentName != "Production")
{
Console.WriteLine("Invalid environment. Please choose between Local, Test, or Production.");
environmentName = Console.ReadLine();
}
}
else
{
Console.WriteLine("Application was started without arguments.");
if (Environment.GetEnvironmentVariable("COMPUTERNAME").Contains("dev"))
{
environmentName = "Local";
}
else if (Environment.GetEnvironmentVariable("COMPUTERNAME").Contains([Azure name]))
{
environmentName = "Test";
}
else
{
environmentName = "Production";
}
}
}
public static IHostBuilder CreateHostBuilder(string[] args, string environment) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configApp =>
{
var path = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
configApp.SetBasePath(path);
configApp.AddJsonFile($"appsettings.{environment}.json", false, true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog();
我可以做些什么来确保我的测试 Azure 使用测试环境,而我的生产使用生产?
解决方案
您的代码不应该知道环境的名称,更不用说计算机名称,否则如果有一天您需要设置环境 test2,则需要重新编译。
您不应该将所有设置文件部署到所有环境。例如,开发或测试不应该有您的生产设置,即使它不使用它们。主要关注点:安全。
我会在部署过程中为服务器设置适当的环境变量设置。理想情况下是通过自动化管道,但您也可以通过手动修改 azure 应用服务的配置刀片中的设置来执行此操作。
如果您仍想使用这些文件:
- 删除选择当前环境的 if 语句。
- 在环境变量中设置环境名称:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-5.0
- CreateDefaultBuilder 的默认配置会自动尝试查找名为 appSettings.{envname}.json 的文件并加载它。
请记住,这会加载配置的每个源,并且某些内容会覆盖其他内容。如果您在特定于环境的文件中有一个变量,这将优先于一般的 appsettings.json 变量。如果您在通用文件中而不是在特定于环境的文件中有内容,您将获得通用值。这对于不会因环境而改变的事物很有用。
然后,如果您在 azure 门户的配置刀片中有环境变量或变量(我理解它们是相同的东西),这些优先于文件的内容。(我只是走这条路,让管道将环境变量插入到目标机器中,并且不打扰文件,因为在管道中管理机密更容易)
推荐阅读
- cordova - 加载的页面启动 3rd 方应用程序时出现 Cordova 错误
- blazor - 如果路由器不匹配,Blazor 404 页面不显示
- xamarin - 如何在 xamarin.forms 中初始化数据并使数据绑定正常工作?
- android - 实例化克隆在碰撞输入时不被破坏
- python - 如何使用 Python 从 C++ 读取谷物序列化数据
- java - 如果我有 Mockito.Spy()/@Spy 不能与 FieldSetter 一起正常工作?如何结合使用@Spy 和 FieldSetter?
- javascript - 如何检查用户是否通过 jQuery selectable 选择了一个项目?
- android - Android App Bundle(仅限) - 无法加载原生库
- .htaccess - Yii2 提前将 url 后端/web 替换为管理员
- swift - swiftui @State 值取决于 @ObservedObject ViewModel 初始化错误