在Azure Functions中读取环境变量时,为什么建议使用GetEnvironmentVariable而不是AppSettings

Tar*_*rek 7 .net c# environment-variables azure azure-functions

微软的文档指出,

在本地开发和在Azure中运行时,可以从环境变量中读取应用程序设置.在本地开发时,应用程序设置来自local.settings.json文件中的Values集合.在本地和Azure环境中,GetEnvironmentVariable("")检索指定应用程序设置的值.例如,当您在本地运行时,如果您的local.settings.json文件包含{"Values":{"WEBSITE_SITE_NAME":"我的站点名称"}},则会返回"我的站点名称".

System.Configuration.ConfigurationManager.AppSettings属性是获取应用程序设置值的备用API,但我们建议您使用此处所示的GetEnvironmentVariable.

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

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

或者我只是接受这个作为生活中的事实而不知道为什么?

Jer*_*Liu 6

它有性能优势吗?

我会说一般它是基于我的测试。GetEnvironmentVariableConfigurationManager在我的电脑上(100k 次)快一点,它的平均执行时间大约短 20?s,而在 Azure(B1 应用服务计划,10k 次)上大约短 12?s。这是一个统计结论,ConfigurationManager有时可能会更快。

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

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

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

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

总结一下,GetEnvironmentVariable

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

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