从 VS 2017 Azure 函数开发中的 local.settings.json 读取值

Posted

技术标签:

【中文标题】从 VS 2017 Azure 函数开发中的 local.settings.json 读取值【英文标题】:Read values from local.settings.json in VS 2017 Azure Function development 【发布时间】: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 【参考方案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"
    
  

【讨论】:

谢谢@Fred .. 我在Values 中有另一个对象。我的错。 查看@Chris Koester 关于 推荐方式的帖子:docs.microsoft.com/en-us/azure/azure-functions/… 更准确地说,Azure Functions 根本不支持嵌套设置,即 local.settings.json 文件 与 .NET Core 中的 appsettings.json 工作方式相同: github.com/Azure/azure-functions-host/issues/… @Venky 是的,但如果你想拥有嵌套的键值,你可以这样做:nested keys【参考方案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 链接。

以上是关于从 VS 2017 Azure 函数开发中的 local.settings.json 读取值的主要内容,如果未能解决你的问题,请参考以下文章

Azure Devops - 无法构建从 vs2017-win2016 到 windows-latest 的管道代理

.NET Core 中的 Azure WebJobs 使用 VS 2017 15.3

如何使用异步方法从 Azure 函数中的存储读取

Azure DevOps 中的开发人员命令提示符

从 Azure DevOps 管道启动适用于 VS 2019 的开发人员 PowerShell

使用 azure 函数从表单数据请求中详细说明并存储在 azure blob 中的多个文件