【发布时间】: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