【问题标题】:Complex object app settings in Azure FunctionAzure Function 中的复杂对象应用设置
【发布时间】:2020-01-07 20:50:55
【问题描述】:

我的 local.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. 如何在 Azure 门户中为我已部署的 Function App 配置 BusinessUnitMapping?

-艾伦-

【问题讨论】:

  • 我现在有同样的问题,但似乎仍然没有解决方案。需要采用扁平化方法。

标签: c# azure .net-core azure-functions


【解决方案1】:
  1. 这是在 Azure Function 中存储复杂应用设置的正确方法吗?

这仍然是一个悬而未决的问题:请参阅this github issue asking exactly this

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

我目前首选的方法是将options pattern 与使用 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 中,您可以按如下方式创建这些设置:

【讨论】:

  • 不确定这是否是新更改,但我无法在我的 Function App 中创建名称中包含“:”的设置。
  • 在 Linux 托管的 Function 应用程序中不支持使用 ':' 作为分隔符。我改为使用“__”(双下划线)使其工作。
  • 来自文档:“值必须是字符串,而不是 JSON 对象或数组。设置名称不能包含冒号 (:) 或双下划线 (__)。这些字符由运行时保留。” docs.microsoft.com/en-us/azure/azure-functions/…
  • 有没有办法在设置中添加字典?
【解决方案2】:

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

我们可以将这些条目保存在应用设置中。更多详情请参考document。详细步骤如下。

在 Azure 门户上设置应用设置

2.如何在 Azure 门户中为我已部署的 Function App 配置 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()
        {

        }
    }

【讨论】:

  • 这不起作用。我不知道它是否改变了,但是对于 V2 函数, { "prop":"value"} 不会反序列化(或正在发生的任何事情)成字典
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多