【问题标题】:Configure Azure Web Sites/Jobs app settings when developing locally在本地开发时配置 Azure 网站/作业应用程序设置
【发布时间】:2019-06-24 23:03:43
【问题描述】:

如本文所述:https://azure.microsoft.com/en-us/blog/windows-azure-web-sites-how-application-strings-and-connection-strings-work/,Azure Web 应用程序/网站/Web 作业可以从环境变量而不是 app.config/web.config 中获取其配置设置(appSettings、connectionString)。

例如,如果存在名为“APPSETTING_appSettingKey”的环境变量,它将覆盖 app.config/web.config 中的以下设置:

<appSettings>
  <add key="appSettingKey" value="defaultValue" /> 
</appSettings>

一旦将应用程序部署到 Azure 中就可以正常工作,但我想在本地测试时使用相同的方法。

我试图在本地命令行中模拟这个:

> set APPSETTING_appSettingKey=overridedValue
> MyWebJob.exe

网络作业使用以下方式访问此设置:

ConfigurationManager.AppSettings["appSettingKey"]

在 Azure 中运行时,它按预期读取值“overridedValue”,但在本地它从 app.config 文件中读取值“defaultValue”。

我应该期望它能够工作,还是仅在 Azure 环境下实现?

我显然可以在 ConfigurationManager 上创建一个抽象来模拟这个,但是当调用需要连接字符串 name 而不是连接字符串 value 的代码时,这将不起作用.另外,我想在任何环境下都使用相同的方法来简化设置管理。

我需要这个有 3 个原因:

1) 我不喜欢将 web.config 文件部署到生产环境的想法,该文件引用开发环境的连接字符串等,因为存在会导致开发设置的错误风险(在 web.config ) 用于生产(生产网络应用程序连接到开发数据库等),例如,如果环境变量命名不正确(在 web.config 中重命名设置但忘记在环境变量中重命名它)

2) 我正在尝试设置开发环境,其中每个开发人员都有自己独立的云资源(存储帐户、数据库等)。目前,每个人都必须手动编辑他的 .config 文件以引用正确的资源,并且在签入或合并对这些文件的更改时要小心。

3) 一个解决方案可以有多个需要复制相同设置的项目(主 Web 应用程序、Web 作业、集成测试项目......)。这需要大量工作来确保在所有文件中复制更新的设置。

如果有一个独立于环境的 .config 文件而没有任何实际配置,这将得到简化,每个开发人员只需配置一组环境变量,就可以将它们用于解决方案的所有部分。

【问题讨论】:

  • 你可以试试CloudConfigurationManager ?
  • 在 Azure 网站/Web 作业下运行时,ConfigurationManager 将已经实现类似于 CloudConfigurationManager 的行为。我正在寻找的是一种在本地具有相同行为的方法(如果存在,则从环境变量中覆盖 web.config 设置)。我将编辑问题以解释我为什么需要这个。
  • @ckarras 我认为您遇到的问题之一是,当您定义在本地使用的应用程序设置时,该应用程序设置(可能是秘密)被部署到 Azure,正如你所说,你不想要。您可能会发现在部署之前使用 web.config 转换从配置文件中删除这些值很有帮助。对于 webjobs(或任何带有 app.config 的项目),您需要 SlowCheetah nuget 包 marketplace.visualstudio.com/…
  • 您是否考虑过使用用户机密?例如,如果您使用 VIsual Studio,右键单击您的 ASP.NET Core 项目并选择“管理用户机密”。这将调出secrets.json。然后,您可以在其中粘贴您的 Web 应用程序的本地配置值,并且默认情况下会阻止该文件签入。这种方法的一个缺点是每个开发人员都需要在他们的开发机器上复制设置,但除此之外它工作得很好。

标签: azure-web-app-service azure-webjobs


【解决方案1】:

是的,环境变量到配置值的这种特殊转换是通过特定于 Azure WebApps 的组件完成的,不会在本地运行。

通常人们对由此产生的本地行为感到满意 - 在本地,您照常从配置设置中读取,但在 Azure 中,您正在从通过应用设置门户刀片配置的安全设置中读取(因此这些设置不是在您的源代码中)。

如果你愿意,你可以写一个抽象,例如WebJobs SDK 实际上在内部执行此操作(代码 here)。

【讨论】:

  • 我认为 OP 遇到的问题之一是,如果他定义了一个在本地使用的应用程序设置,那么该应用程序设置(可能是一个秘密)将部署到 Azure。我认为 OP 需要 web.config 转换或更具体地用于 webjobs SlowCheetah nuget 包marketplace.visualstudio.com/…,它允许对非 web.config 文件进行转换。
【解决方案2】:

当我在本地开发并希望始终使用 Environment.GetEnvironmentVariable 时。在我的静态类 Main 中,我有以下代码:

if (config.IsDevelopment)
{
    config.UseDevelopmentSettings();
    Environment.SetEnvironmentVariable("UseDevelopmentSettings", "true");
}

然后在我的静态类 Functions 中添加一个静态构造函数,并在其中调用下面的静态方法:

static void AddAppSettingsToEnvironmentVariables()
{
    String useDevelopmentSettings = Environment.GetEnvironmentVariable("UseDevelopmentSettings"); ;
    if (!(String.IsNullOrEmpty(useDevelopmentSettings)))
    {
        foreach (String key in ConfigurationManager.AppSettings.AllKeys)
        {
            Environment.SetEnvironmentVariable(key, ConfigurationManager.AppSettings[key]);
        }
    }
}

代码足够小,我可以在 Azure 中测试之前简单地将其注释掉。

【讨论】:

    【解决方案3】:

    如果您想使用将在 Azure 门户 AppSettings/Connection String 中使用的值来测试应用程序。我建议使用HostingEnvironment.IsDevelopmentEnvironment。为确保它能够正常工作,请将&lt;compilation debug="true" targetFramework="4.5.2" /&gt; 更改为&lt;compilation debug="false" targetFramework="4.5.2" /&gt;。如果 (HostingEnvironment.IsDevelopmentEnvironment == false),请在 Azure 门户中将值设置为相同的值。我尝试了一个简单的项目,希望对您有所帮助:

            public ActionResult Index()
            {
                if (HostingEnvironment.IsDevelopmentEnvironment == true)
                {
                    ViewBag.Message = "Is development.";
                }
                else
                {
                    ViewBag.Message = "Azure environment.";
                }
                return View();
    
            }
    

    结果如下:

    【讨论】:

    • 题外话,这根本不能回答我的问题。无论 IsDevelopmentEnvironment 的值如何,我都会得到相同的行为:app.config/web.config 中指定的 appSettings 不会被 APPSETTING_settingName 环境变量中指定的值覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多