从 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.json
和 local.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.json
的Values
部分中:
"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