向appsettings.json
添加密钥的标准结构是什么?
另外,如何在run.csx
中阅读这些值?
通常在app.config中,我们有ConfigurationManager.GetSettings["SettingName"];
Azure功能中是否有类似的实现?
答案 0 :(得分:6)
如上所述here
这些设置也可以在代码中作为环境变量读取。在C#中,使用
System.Environment.GetEnvironmentVariable
或ConfigurationManager.AppSettings
。在JavaScript中,使用process.env
。指定为系统环境变量的设置优先于local.settings.json
文件中的值。
答案 1 :(得分:6)
在Azure Functions 2.x中,您需要使用软件包Microsoft.Extensions.Configuration
中包含的.Net核心配置管理样式。这使您可以在开发计算机上创建本地settings.json
文件,以便在json文件的Values
和ConnectionString
部分中进行本地配置。 local json
设置文件未发布到Azure,相反,Azure将从与该功能关联的应用程序设置中获取设置。
在功能代码中,接受类型为Microsoft.Azure.WebJobs.ExecutionContext context
的参数,然后您可以在其中构建IConfigurationRoot
提供程序:
[FunctionName("MyFunction")]
public static async Task Run([TimerTrigger("0 */15 * * * *")]TimerInfo myTimer,
TraceWriter log, Microsoft.Azure.WebJobs.ExecutionContext context,
CancellationToken ctx)
{
var config = new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
// This abstracts away the .json and app settings duality
var myValue = config["MyKey"];
var myConnString = config.GetConnectionString("connString");
... etc
AddJsonFile
允许您添加本地开发配置文件,例如local.settings.json
包含本地开发者值(未发布)
{
"IsEncrypted": false,
"Values": {
"MyKey": "MyValue",
...
},
"ConnectionStrings": {
"connString": "...."
}
尽管似乎将ConnectionStrings用于EF seems to be discouraged以外的其他东西
并将其部署到Azure后,可以在功能“应用程序设置”刀片上更改设置的值:
答案 2 :(得分:3)
您无需使用System.Environment.GetEnvironmentVariable()
来访问您的应用设置。
ConfigurationManager
可在run.csx中用于Azure Functions,如下所示:
System.Configuration.ConfigurationManager.AppSettings["SettingName"]
答案 3 :(得分:2)
要加载环境或appsettings值,您需要使用
System.Environment.GetEnvironmentVariable属性
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
log.Info(GetEnvironmentVariable("AzureWebJobsStorage"));
log.Info(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}
public static string GetEnvironmentVariable(string name)
{
return name + ": " +
System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}
答案 4 :(得分:1)
Azure函数仅支持app.config
的有限部分。从VS运行功能时,它可以将应用程序设置和连接保存在local.settings.json
中。它不支持此json文件中system.serviceModel
下的WCF端点设置。我在Azure函数中有一个dll库引用,并且在内部调用WCF api。
我发现的奇怪事情是,当我运行Azure函数时,它将cli路径(%localappdata%\AzureFunctionsTools\Releases\1.6.0\cli\func.exe.config
处的json转换回xml配置。我将xml配置层次结构(system.serviceModel
)添加到此配置文件中,并且工作正常,选择了WCF端点来运行服务。尽管在使用log4net配置方面遇到了困难,但是很好地运行API。
Azure应该直接支持xml配置文件。
希望这会有所帮助。
答案 5 :(得分:0)
应用程序设置不是由功能本身管理,而是由其功能应用程序管理。所以,如果您使用cli,那就可以了...
az functionapp appsettings set .....
这就是我在CI / CD管道中执行此操作的方式。之后,您可以在函数中使用它们。请记住,一个功能必须存在于一个功能应用程序中,因此将所有这些值放置在其中是有意义的,这样您就可以在每个功能中使用它们。
答案 6 :(得分:0)
这是设置方法:
在回购的根目录添加json,例如app.settings.json
按如下所示添加Diretory.Build.targets(.targets是此处的扩展名)文件
<Project>
<PropertyGroup>
<_IsFunctionsSdkBuild Condition="$(_FunctionsTaskFramework) != ''">true</_IsFunctionsSdkBuild>
<_FunctionsExtensionsDir>$(TargetDir)</_FunctionsExtensionsDir>
<_FunctionsExtensionsDir Condition="$(_IsFunctionsSdkBuild) == 'true'">$(_FunctionsExtensionsDir)bin</_FunctionsExtensionsDir>
</PropertyGroup>
<Target Name="CopyExtensionsJson" AfterTargets="_GenerateFunctionsAndCopyContentFiles">
<Message Importance="High" Text="Overwritting extensions.json file with one from build." />
<Copy Condition="$(_IsFunctionsSdkBuild) == 'true' AND Exists('$(_FunctionsExtensionsDir)\extensions.json')"
SourceFiles="$(_FunctionsExtensionsDir)\extensions.json"
DestinationFiles="$(PublishDir)bin\extensions.json"
OverwriteReadOnlyFiles="true"
ContinueOnError="true"/>
</Target>
<Target Name="CopyVaultJson" AfterTargets="_GenerateFunctionsAndCopyContentFiles">
<Message Importance="High" Text="Overwritting app.settings.json file with one from build." />
<Copy Condition="$(_IsFunctionsSdkBuild) == 'true' AND Exists('$(_FunctionsExtensionsDir)\app.settings.json')"
SourceFiles="$(_FunctionsExtensionsDir)\app.settings.json"
DestinationFiles="$(PublishDir)bin\app.settings.json"
OverwriteReadOnlyFiles="true"
ContinueOnError="true"/>
</Target>
</Project>
这将在运行dotnet构建时明确告诉编译器包括app.settings.json文件,并将所述文件包含在/ bin中,从而允许dll访问它。
快乐的编码。