【问题标题】:Azure Functions - configuration settings returns null when I try to debug locallyAzure Functions - 当我尝试在本地调试时,配置设置返回 null
【发布时间】:2019-01-20 06:42:23
【问题描述】:

我有以下代码:

    [FunctionName("FunctionValidateDriverRecord")]
    public static async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, TraceWriter log)
    {
        string connString = ConfigurationManager.ConnectionStrings["AssetContext"].ConnectionString;
        string mail = ConfigurationManager.AppSettings["EmailForErrors"];

和local.settings.json:

{
  "IsEncrypted": false,
  "ConnectionStrings": {
    "AssetContext": "data source=server;initial catalog=3md_vistracks_sync;integrated security=True;MultipleActiveResultSets=True"
  },
  "AppSettings": {
    "EmailForErrors": "brauncomm@gmail.com"
  }
}

connString 有值,但mail 为空。为什么?

【问题讨论】:

    标签: c# azure azure-functions configurationmanager


    【解决方案1】:

    Azure Functions 使用环境变量。 https://docs.microsoft.com/en-us/sandbox/functions-recipes/environment-variables?tabs=csharp

    我不确定是否有使用 ConfigurationManager 的实际代码,但这不适用于 Azure Functions。

    【讨论】:

      【解决方案2】:

      在 local.settings.json 中,您应该使用 Values 而不是 AppSettings。 Azure 函数本地开发需要文件架构。

      您可能正在使用 v1 函数,请随意使用 ConfigurationManager,因为您发现它对 connectionString 有效。 v2 不支持 ConfigurationManager,您可以参考环境变量,有关读取本地和 Azure 设置的更多详细信息,请参阅answer

      【讨论】:

        【解决方案3】:

        几天前我遇到了完全相同的问题,并使用 IConfigurationBuilder 解决了它。这是代码sn-p。

        [FunctionName("Function1")]
            public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, TraceWriter log, ExecutionContext context)
            {
                var config = new ConfigurationBuilder()
                .SetBasePath(context.FunctionAppDirectory)
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();
        
                var cstr = config.GetConnectionString("SqlConnectionString");
                var appSettings = config.GetSection("AppSettings")["EmailForErrors"];
        
                log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
            }
        

        【讨论】:

          【解决方案4】:

          对于计时器触发器,您不能使用 Executioncontext。通过使用以下代码,您可以从 Json 文件中获取值。

          var config = new ConfigurationBuilder()
              .SetBasePath(Directory.GetCurrentDirectory())
              .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
              .AddEnvironmentVariables()
              .Build();
          
          var clientId = config["ClientId"];
          

          【讨论】:

          • 部署时是否有效?它是否适用于 NoAutomaticTrigger 类型?
          • 是的,确实如此。请记住在部署 Function 时配置应用程序设置。这样在 local.setting.json 中定义的值也存在于远程中。如果您从 VS 部署它,您可以选择设置远程应用程序设置,或者您可以直接在 Azure 门户中进行。
          猜你喜欢
          • 1970-01-01
          • 2014-12-22
          • 1970-01-01
          • 2021-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-11
          相关资源
          最近更新 更多