首页 > 解决方案 > 使用特定 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 使用测试环境,而我的生产使用生产?

标签: c#asp.net-coreasp.net-web-apiazure-web-app-service

解决方案


您的代码不应该知道环境的名称,更不用说计算机名称,否则如果有一天您需要设置环境 test2,则需要重新编译。

您不应该将所有设置文件部署到所有环境。例如,开发或测试不应该有您的生产设置,即使它不使用它们。主要关注点:安全。

我会在部署过程中为服务器设置适当的环境变量设置。理想情况下是通过自动化管道,但您也可以通过手动修改 azure 应用服务的配置刀片中的设置来执行此操作。

如果您仍想使用这些文件:

  1. 删除选择当前环境的 if 语句。
  2. 在环境变量中设置环境名称:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-5.0
  3. CreateDefaultBuilder 的默认配置会自动尝试查找名为 appSettings.{envname}.json 的文件并加载它。

请记住,这会加载配置的每个源,并且某些内容会覆盖其他内容。如果您在特定于环境的文件中有一个变量,这将优先于一般的 appsettings.json 变量。如果您在通用文件中而不是在特定于环境的文件中有内容,您将获得通用值。这对于不会因环境而改变的事物很有用。

然后,如果您在 azure 门户的配置刀片中有环境变量或变量(我理解它们是相同的东西),这些优先于文件的内容。(我只是走这条路,让管道将环境变量插入到目标机器中,并且不打扰文件,因为在管道中管理机密更容易)


推荐阅读