Azure Function中复杂对象应用程序设置

16

我在本地的settings.json文件中有这些条目。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "whateverstorageaccountconnectionstring",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    },
    "BusinessUnitMapping": {
        "Values": {
            "Connections": "CON",
            "Products": "PRD",
            "Credit & Affordability": "CAA",
            "Accounts Receivable": "ARC",
            "Identity":  "IDT"
        }
    }
}

我有这段代码来读取启动时的数值。

services.Configure<BusinessUnitMapping>(options => configuration.GetSection("BusinessUnitMapping").Bind(options));

BusinessUnitMapping是什么

public class BusinessUnitMapping
{
  public Dictionary<string, string> Values { get; set; }
  public BusinessUnitMapping()
  {
      Values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
  }
}

当我在本地运行函数应用时,它可以将这些设置读入BusinessUnitMapping而没有任何问题。

Azure门户中的应用程序设置高级编辑仅允许以下简单的键值对:

[
  {
    "name": "AzureWebJobsDashboard",
    "value": "DefaultEndpointsProtocol=Somevalue",
    "slotSetting": false
  },
  {
    "name": "AzureWebJobsStorage",
    "value": "DefaultEndpointsProtocol=Somevalue",
    "slotSetting": false
  },
  ...
]

这些问题

  1. 在Azure Function中存储复杂应用程序设置的方法是否正确?
  2. 我该如何在我已部署的Function App中在Azure Portal上配置BusinessUnitMapping?

-艾伦-


我现在也遇到了同样的问题,但似乎还没有解决方案。需要采用扁平化的方法。 - Matthias Müller
2个回答

6
  1. 在Azure Function中存储复杂应用程序设置的正确方法是什么?

这仍然是一个未解决的问题:请参见此GitHub问题,准确地提出了这个问题

  1. 如何为我已部署的Function App在Azure Portal中配置BusinessUnitMapping?

我目前首选的方法是使用选项模式和使用GetEnvironmentVariable的委托,这将在本地和Azure中都起作用。缺点是您无法在本地设置文件本身中创建复杂类型,但是对象可以很复杂。

一个简单的例子:

在local.settings.json中:

{
  ...
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    ...
    "SomeSection:Setting1": "abc",
    "SomeSection:Setting2": "xyz",
  },
  ...
}

在你的创业公司中:

services.Configure<MySettingsPoco>(o =>
{
    o.Setting1 = Environment.GetEnvironmentVariable("SomeSection:Setting1");
    o.Setting2 = Environment.GetEnvironmentVariable("SomeSection:Setting2");
});

在Azure中,您可以按照以下方式创建这些设置:

输入图像描述


3
不确定这是否是一个新的更改,但我无法在我的函数应用程序中创建名称中带有“:”的设置。 - Tobias
3
结果发现在Linux托管的函数应用中不支持使用“:”作为分隔符。我通过使用“__”(双下划线)来替代成功地解决了这个问题。 - Tobias
1
从文档中得知: “值必须是字符串,不能是JSON对象或数组。设置名称不能包含冒号(:)或双下划线(__)。这些字符由运行时保留。” https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=windows#local-settings-file - LockTar
4
有没有办法在设置中添加词典? - Piotr Perak
很遗憾,无法通过local.settings.json来实现(至少在Linux托管的函数中)。我建议您添加一个单独的json文件(例如appsettings.Development.json),并配置应用程序从那里加载配置。这样可以避免所有的麻烦。 - karolgro

-1

1. 在 Azure Function 中存储复杂的应用程序设置,这种方法正确吗?

我们可以将这些条目保存在应用程序设置中。更多详细信息,请参阅文档。具体步骤如下。

在 Azure 门户上设置应用程序设置 enter image description here enter image description here

2. 如何在已部署的 Function 应用程序中,在 Azure 门户中配置 BusinessUnitMapping?

根据我的测试,我们可以使用以下代码来实现

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;
public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    var test =Environment.GetEnvironmentVariable("test",EnvironmentVariableTarget.Process);
    log.LogInformation(test);
    var values= JsonConvert.DeserializeObject<Dictionary<string, string>>(test);
    var businessUnitMapping = new BusinessUnitMapping();
    businessUnitMapping.Values = values; 
    log.LogInformation(businessUnitMapping.Values["Products"]);
    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

public class BusinessUnitMapping
    {
        public Dictionary<string, string> Values { get; set; }
        public BusinessUnitMapping()
        {

        }
    }

enter image description here


2
这个不起作用。我不知道它是否已经改变,但对于V2函数,“{“prop”:“value”}”无法反序列化(或发生的任何事情)为dictionary<string,string>。 - A.Rowan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接