发布 azure 函数并使用 appsettings.json

Posted

技术标签:

【中文标题】发布 azure 函数并使用 appsettings.json【英文标题】:Publish azure functions and use appsettings.json 【发布时间】:2017-08-14 12:15:36 【问题描述】:

我有一个 Azure Functions 项目,我正在使用 Visual Studio 2017 15.3 preview 7 用 C# 编写该项目。函数项目包含两个单独的函数,这两个函数都是计时器触发的。我在 appsettings.json 文件中指定了许多 appsettings,该文件设置为 Copy to the output directory on build.

当我发布 Azure Functions 项目时,这两个函数会显示在 Azure 门户中,但是它们会失败,因为它们无权访问应用程序设置。现在我知道我可以在应用程序设置刀片中指定设置,但我想使用 appsettings.json 根据这个 github 问题应该是可能的:https://github.com/Azure/azure-functions-cli/issues/33

这个 SO 答案包含一些关于让它工作的信息Azure Functions - using appsettings.json。现在问题在于“Azure 将尝试将 appsettings.json 文件查找到您正在处理的函数的根文件夹中。”我的函数项目包含以下文件结构:

-appsettings.json
-Function_function1.cs
-Function_function2.cs
-host.json

当项目构建和部署时,我最终为 wwwroot 中的每个函数创建了一个文件夹,每个函数都包含一个 function.json 文件。 appsettings.json 文件进入 wwwroot/bin 文件夹,函数无法访问。

我想如果我将函数项目更改为具有文件夹结构它将部署 appsettings.json,我将其更改为以下内容

-host.json
-Function_function1\
--Function_function1.cs
--appsettings.json
-Function_function2\
--Function_function2.cs
--appsettings.json

这没有达到我预期的结果,此时我不太确定我需要做什么才能将 appsettings 复制到 wwwroot 下的功能文件夹而不是 bin 文件夹中,任何指导将不胜感激。

【问题讨论】:

【参考方案1】:

您所指的 SO 帖子包含已弃用的信息。 appsettings.json 不再使用。

对于本地开发,您可以使用 local.settings.json 文件,但函数应用程序中不使用该文件。我刚刚完成了这个测试并验证了这个声明。

您可以在发布函数时使用--publish-local-settings 标志来获取函数应用中的设置。不过,这当然不是你想要的。

我自己也在寻找不涉及创建 ARM 模板的解决方案,但我觉得目前这是不可能的。 您当然可以编写自己的 PowerShell 脚本并以这种方式设置应用程序设置,但这更糟。

可能不是您真正想要的答案,但它是(目前)最好的答案。

【讨论】:

我相信这是正确的——我们已经走上了这条路,使用 ARM 模板来填充我们功能应用程序的应用程序设置。然后设置 VSTS 构建以在我们提交对实际功能代码的更改时更新这些应用程序。它对我们来说已经足够好用了 - 但同意一个替代方案会很好,所以很想听听是否有一个。 很遗憾事情发生了变化,它不会自动使用 appsettings.json。您应该能够做到的另一种方法是使用 Azure Powershell 命令行开关“Set-​Azure​Website”和 set-appsettings,这将存储您在标准应用程序设置部分中指定的设置,尽管连接了 set-azurewebsite拿起 appsettings.json 需要更多的工作。 这里是一个 GitHub 功能请求,您可以分享 cmets 关于更简单的方法来管理 Function App 设置:github.com/Azure/azure-functions-cli/issues/339 这是对之前更新的后续Azure Functions CLI,它使我们能够部署设置(而不是二进制文件):github.com/Azure/azure-functions-cli/issues/157【参考方案2】:

在 Azure Functions 中,设置存储在 local.setting.json 中(如果您的解决方案中不存在此文件,则创建此文件/名称应与上述完全相同)。

示例 local.settings.json 正文,


  "IsEncrypted": false,
  "Values": 
    "email": "email@server.com",
    "pass": "pass"
  ,
  "ConnectionStrings": 
    "SqlConnectionString": "server=jongdb;user=jong;"
  

添加设置文件后,您必须在 Run() 方法下对其进行配置,如下所述,

var config = new ConfigurationBuilder().SetBasePath(context.FunctionAppDirectory)
                .AddJsonFile("local.settings.json", optional: false, reloadOnChange: true).AddEnvironmentVariables().Build();

访问设置时,在下方使用

IConfigurationRoot config;
config["fromEmail"];

使用以下命令发布设置

func azure functionapp publish *YourAppName* --publish-local-settings -i

部署完成后,您将在 Azure 门户中的应用程序设置下看到设置(查看下图)

必填, 需要在您的计算机中安装 Azure CLI,

Download

【讨论】:

在 VS Code 中,如果您有 Azure 扩展,您只需在导航窗格中右键单击您的函数并上传本地设置。 您可能希望 optional:false 为真,因为除非在本地开发机器上,否则本地设置文件不应按设计位于输出/函数文件夹中。那么它不会在天蓝色中失败吗? --publish-local-settings 标志会将开发应用程序设置作为生产值发送到 azure,这些值会由您包含的 .AddEnvironmentVariables() 调用获取。

以上是关于发布 azure 函数并使用 appsettings.json的主要内容,如果未能解决你的问题,请参考以下文章