【问题标题】:Why is GetEnvironmentVariable recommended to use over AppSettings when reading Environment variables in Azure Functions为什么在 Azure Functions 中读取环境变量时建议使用 GetEnvironmentVariable 而不是 AppSettings
【发布时间】:2018-08-12 11:45:41
【问题描述】:

Microsoft documentation 声明

在本地开发和在 Azure 中运行时,都可以从环境变量中读取应用设置。在本地开发时,应用设置来自 local.settings.json 文件中的 Values 集合。在本地和 Azure 这两种环境中,GetEnvironmentVariable("") 都会检索命名应用设置的值。例如,当您在本地运行时,如果您的 local.settings.json 文件包含 { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } },则会返回“My Site Name”。

System.Configuration.ConfigurationManager.AppSettings 属性是 用于获取应用设置值的替代 API,但我们建议 您使用 GetEnvironmentVariable,如下所示。

没有说明为什么它是推荐的方式。

  • 它有性能优势吗?
  • 是否存在从 AppSettings 读取会导致空值的实例?
  • 是否只是为了兼容不同的配置格式(即json、xml等)?

或者我只是在不知道为什么的情况下接受这是生活中的事实?

【问题讨论】:

    标签: c# .net azure environment-variables azure-functions


    【解决方案1】:

    它有性能优势吗?

    我会根据我的测试说一般情况下。 GetEnvironmentVariableConfigurationManager 快一点,在我的电脑上(100k 次)它的平均执行时间短了约 20μs,而在 Azure(B1 应用服务计划,10k 次)上则短了约 12μs。这是一个统计结论,因为ConfigurationManager 有时会更快。

    是否存在从 AppSettings 读取会导致空值的实例?

    如果要读取的值按预期设置,可能只有一种情况是我们使用ConfigurationManager得到null--在v2函数中,它不再有用了。

    是否只是为了兼容不同的配置格式(即json、xml等)?

    GetEnvironmentVariable没有这种能力,对格式兼容性没有要求。 Azure 函数在本地开发中从 local.settings.json 获取配置是设计使然,当函数宿主启动时,Values 中的应用程序设置会导入到当前进程的环境变量中。所以不考虑格式。

    总之,GetEnvironmentVariable

    • 简洁——无需导入System.Configuration的程序集即可使用ConfigurationManager
    • 通用--适用于 v1 和 v2、本地和 Azure 环境。(在 local.settings.json 中不包括 ConnectionStrings)。
    • 更快——可能不太可靠,我使用简单的循环重复触发,并使用秒表进行测量(禁用所有日志)。

    当然,我们仍然可以在 v1 函数中利用 ConfigurationManager,如果我们想在本地获取 ConnectionStrings,我们必须使用它。

    【讨论】:

    • 感谢您的回答,您所说的一切都很有道理。我想知道为什么它没有包含在原始文档中。
    • @Tarek 很高兴您发现它有帮助。答案是基于我的测试和理解,肯定还有一些需要考虑。关于文档,Azure 团队几乎每隔几周就会发布一次更新,文档可能不会轻易定型,我们关注的细节也不能总是包含在内。所以我们需要像这样询问和交流想法:)
    【解决方案2】:

    我能想到的一个动机是设置环境变量可确保敏感信息不会硬编码在源代码存储库中。

    【讨论】:

    • 我明白你在说什么,乔伊。我不认为是这样,您仍然可以将项目作为环境变量存储在 azure 中,并通过 ConfigurationManager.AppSettings 或 CloudConfigurationManager.AppSettings 读取它们。不过谢谢你的回复。
    猜你喜欢
    • 2010-11-06
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2013-02-06
    • 2022-10-05
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多