【问题标题】:Accessing nested Json settings from an Azure function从 Azure 函数访问嵌套的 Json 设置
【发布时间】:2020-01-05 13:42:13
【问题描述】:

我有一个 Azure 函数,我从中读取 Json (local.settings.json) 配置文件中的值,如下所示:

  "ConnectionStrings": {
    "SqlConnectionString": "Server=..."
  },

  "OtherSettings": {
    "MyData": "DataHere"
  }

在我的 Azure 函数中,我正在读取这样的连接字符串:

string connectionString = System.Environment.GetEnvironmentVariable($"ConnectionStrings:SqlConnectionString", EnvironmentVariableTarget.Process);

这很好用。但是,如果我对任何其他设置尝试相同的技术,它就不起作用。例如:

string myData = System.Environment.GetEnvironmentVariable($"OtherSettings:MyData", EnvironmentVariableTarget.Process);

只返回空值。请有人告诉我为什么这适用于连接字符串,但不适用于其他设置。另外,解决这个问题的方法是什么(一旦部署了函数,我需要代码来获取覆盖的参数)?

编辑:

我知道如果 local.settings.json 的所有设置都在 Values 节点中,它可以正常工作。我的问题与嵌套设置有关。

【问题讨论】:

  • 看看希望它能解决您的问题。如果您有任何问题,请告诉我。
  • 您还有什么顾虑吗?告诉我。

标签: c# azure environment-variables azure-functions connection-string


【解决方案1】:

是的,你不能像这样通过System.Environment.GetEnvironmentVariable 获得OtherSettings。您应该尝试以下方式。

你的函数签名:

ILogger log之后将新参数添加为ExecutionContext context。您的函数应如下所示:

        [FunctionName("CuriousDevJsonSettingsFunction")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log, ExecutionContext context)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
        }

函数体上的配置生成器:

在您的函数体上设置以下代码。这将获取您所有的 local.settings.json 属性。

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

从函数中检索您的 local.settings.json 属性:

它将准确检索您在settings.json 文件中定义的属性及其值。

 var otherSettings = new OtherSettings();
 config.Bind("OtherSettings", otherSettings);

函数最终应该是这样的:

public static class CuriousDevJsonSettingsFunction
    {
        [FunctionName("CuriousDevJsonSettingsFunction")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log, ExecutionContext context)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

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

            //Access local.settings.json file 
            var otherSettings = new OtherSettings();
            config.Bind("OtherSettings", otherSettings);

            return new OkObjectResult(otherSettings.MyData);
        }
    }

我用过的课程:

  public class OtherSettings
    {
        public string MyData { get; set; }
    }

注意:这是从函数中检索local.settings.json 属性值的方法。更多详情可以查看this docs

【讨论】:

  • .AddJsonFile("local.settings.json"...) 会对发布的版本产生什么影响(因为该文件一旦发布就不会存在)?
  • 不,它不会发布。它仅适用于本地开发。如果您希望影响已发布的版本,您应该在 azure 门户上设置 App settings。见Application settings
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
相关资源
最近更新 更多