【问题标题】:Read values from local.settings.json in VS 2017 Azure Function development从 VS 2017 Azure 函数开发中的 local.settings.json 读取值
【发布时间】:2017-10-12 16:32:17
【问题描述】:

我正在 VS 2017 中编写 Azure 函数。我需要设置一些自定义配置参数。我在local.settings.json 下的Values 下添加了它们。

{
   "IsEncrypted":false,
   "Values" : {
      "CustomUrl" : "www.google.com",
       "Keys": { 
           "Value1":"1",
           "Value2" :"2"
       }
   }
}

现在,ConfigurationManager.AppSettings["CustomUrl"] 返回 null。

我正在使用:

  • .NET Framework 4.7
  • Microsoft.NET.Sdk.Functions 1.0.5
  • System.Configuration.ConfigurationManager 4.4.0
  • Azure.Functions.Cli 1.0.4

我错过了什么吗?

【问题讨论】:

  • 这应该可以。你能进入调试器看看ConfigurationManager.AppSettings里面有什么吗?
  • 确保将local.settings.json 标记为始终复制到构建输出。
  • @Mikhail - ConfigurationManager.AppSettings 显示 Count = 0、KeyCollection = 0 等的对象。
  • @ahmelsayed 它已经设置为“始终复制”并且构建操作为无。
  • 这很奇怪。我不知道会发生什么,但这是应该发生的。当您从 VS 运行时,它应该编译并将所有文件复制到输出路径,例如 bin\Debug\net461。在那里,您应该找到每个函数的文件夹,以及您的 host.jsonlocal.settings.json。之后,VS 从上面的路径启动Azure.Functions.Cli.exe,该文件夹作为当前工作目录,host start 作为参数。这应该将您的所有设置从该文件夹中的local.settings.json 复制到Azure.Functions.Cli.exe.config

标签: json azure azure-functions appsettings


【解决方案1】:

Environment.GetEnvironmentVariable("key")

我能够使用上面的代码行从 local.settings.json 读取值。

【讨论】:

  • Microsoft 推荐使用此方法,因为它既可以在本地使用 local.settings.json,也可以在 Azure 中使用。 docs.microsoft.com/en-us/azure/azure-functions/…
  • 我们如何使用 Environment 访问 ConnectionStrings 对象中的键?
  • 这是我们使用函数应用时的正确答案
【解决方案2】:

首先,正如 Mikhail 和 ahmelsayed 所说,我创建了一个示例并使用您的 local.settings.json 数据进行测试,它工作正常。

此外,据我所知,Values 集合应该是一个字典,如果它包含任何非字符串值,可能会导致 Azure 函数无法从 local.settings.json 读取值。

我的测试:

ConfigurationManager.AppSettings["CustomUrl"] 使用以下 local.settings.json 返回 null。

{
  "IsEncrypted": false,
  "Values": {
    "CustomUrl": "www.google.com",
    "testkey": {
      "name": "kname1",
      "value": "kval1"
    }
  }
}

【讨论】:

【解决方案3】:

Azure 函数将二进制文件复制到 bin 文件夹并使用 azure 函数 cli 运行,因此它会搜索 local.settings.json,因此请确保您已将 "Copy to Output Directory" 设置为 "Copy Always"

【讨论】:

    【解决方案4】:

    如果您使用基于 TimeTrigger 的 Azure 函数,则可以从 Azure 函数访问您的密钥(在 local.settings.json 中创建),如下所示。

    [FunctionName("BackupTableStorageFunction")]
    public static void Run([TimerTrigger("%BackUpTableStorageTriggerTime%")]TimerInfo myTimer, TraceWriter log, CancellationToken cancellationToken)
    

    【讨论】:

      【解决方案5】:

      嘿,您可能能够在调试时读取属性,但是一旦您尝试在 azure 中部署它,这些属性将不再起作用。 Azure 函数不允许嵌套属性,您必须在“值”选项或“连接字符串”中内联使用所有这些属性。 查看此文档作为参考: https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings

      【讨论】:

        【解决方案6】:

        使用 .Net 6(可能还有一些早期版本)可以将IConfiguration 注入到函数的构造函数中。

        public Function1(IConfiguration configuration)
        {
            string setting = _configuration.GetValue<string>("MySetting");
        }
        

        MySetting 必须在local.settings.jsonValues 部分中:

        {
          "IsEncrypted": false,
          "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
            "MySetting": "value"
          }
        }
        

        它也适用于 Azure Function App 中的应用程序设置。

        【讨论】:

        • Azure 函数,据我所知是静态的。那么您能详细说明一下您是如何进行 DI 的吗?
        • 函数可以是实例方法。请参阅this 链接。
        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多