在本地开发时配置Azure网站/作业应用程序设置

时间:2016-11-11 17:15:44

标签: azure-web-sites azure-webjobs

如本文所述: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)。

例如,如果一个名为&#34的环境变量; APPSETTING_appSettingKey"存在,它将覆盖app.config / web.config中的以下设置:

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

在Azure中部署应用程序后,这样可以正常工作,但我想在本地测试时使用相同的方法。

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

> set APPSETTING_appSettingKey=overridedValue
> MyWebJob.exe

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

ConfigurationManager.AppSettings["appSettingKey"]

在Azure中运行时,它会读取值&#34; overridedValue&#34;正如预期的那样,但在本地它会读取值&#34; defaultValue&#34;来自app.config文件。

我应该期望这个工作,还是仅在Azure环境下实现?

我显然可以在ConfigurationManager上创建一个模拟它的抽象,但是在调用需要连接字符串 name 而不是连接字符串 value 。此外,无论环境如何,我都希望使用相同的方法来简化设置管理。

我需要这样做的原因有三个:

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

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

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

如果存在与环境无关的.config文件而没有任何实际配置,这将被简化,每个开发人员将配置一组环境变量,并且能够将它们用于解决方案的所有部分。

3 个答案:

答案 0 :(得分:3)

是的,将环境变量特殊转换为配置值是通过特定于Azure WebApps的组件完成的,并且不会在本地播放。

一般情况下,人们对这会产生的本地行为很好 - 在本地,您可以像往常一样从配置设置中读取,但在Azure中,您正在读取通过App Settings门户刀片配置的安全设置(因此这些设置不是在你的源代码中。)

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

答案 1 :(得分:0)

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

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

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

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中测试之前简单地将其注释掉。

答案 2 :(得分:-1)

如果要使用将在Azure门户AppSettings / Connection String中使用的值测试应用程序。我建议使用HostingEnvironment.IsDevelopmentEnvironment。为确保其有效,请将<compilation debug="true" targetFramework="4.5.2" />更改为<compilation debug="false" targetFramework="4.5.2" />。如果(HostingEnvironment.IsDevelopmentEnvironment == false),则在Azure门户中使用相同的值设置值。我试过一个简单的项目,希望它有所帮助:

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

        }

结果如下:

enter image description here