繁体   English   中英

.Net 6 函数应用程序未从 Azure 应用程序设置中获取值

[英].Net 6 function app not getting values from Azure application settings

我使用 Visual Studio 2022 创建了一个新的 .net 6 进程内函数应用。该函数应用包含三 (3) 个计时器函数。 我有一个从配置设置填充的自定义设置类。 函数应用在 Visual Studio 的本地开发计算机上正常运行。

将其部署到 Azure 后会出现问题。 依赖注入在 Startup 类中失败,因为自定义设置类未从应用程序功能应用程序设置中正确填充。

这是设置类:

    public class Settings
    {
        public ConnectionStrings ConnectionStrings { get; set; }
        public TwilioSettings TwilioSettings { get; set; }
    }

    public class TwilioSettings
    {
        public string AccountSid { get; set; }
        public string AuthToken { get; set; }
        public string From { get; set; }
    }

    public class ConnectionStrings
    {
        public string ZZZZZZZ { get; set; }
    } 

我有一个 local.settings.json 文件,其中包含自定义设置所需的键/值对:

{
  "IsEncrypted": false,
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  },
  "AzureWebJobsStorage": "UseDevelopmentStorage=true",
  "FUNCTIONS_WORKER_RUNTIME": "dotnet",
  "ConnectionStrings": {
    "ZZZZZZZ": "xxxxxxxxxxxxxxxxxxxxxxxx"
  },
  "TwilioSettings": {
    "AccountSid": "xxxxxxxxxxxxxxxx",
    "AuthToken": "xxxxxxxxxxxxxxxxx",
    "From": "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
}

在 Startup.cs 中,我有以下配置绑定:

        public override void Configure(IFunctionsHostBuilder builder)
        {
            var settings = new Settings();
            var basePath = $"{Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName}\\";
            var jsonPath = $"{basePath.Substring(0, basePath.LastIndexOf('\\'))}\\local.settings.json";
            
            var config = new ConfigurationBuilder()
                        .SetBasePath(basePath)
                        .AddJsonFile(jsonPath, true)
                        .AddEnvironmentVariables()
                        .Build();
            config.Bind(settings);

            builder.Services.AddSingleton(settings);
            builder.Services.AddSingleton(settings.TwilioSettings);
            var cs = settings.ConnectionStrings.ZZZZZ;
            builder.Services.AddDbContextFactory<JTMContext>(opt => opt.UseSqlServer(cs));
            builder.Services.AddDbContext<JTMContext>(opt => opt.UseSqlServer(cs));

        }

在从 Visual Studio 部署之前,我在 Azure 中创建了函数应用资源。 我在应用程序设置和连接字符串中添加了必要的键/值对:

Azure 函数应用配置

一旦我从 Visual Studio 发布了函数应用程序,一切看起来都很好,直到其中一个计时器函数被触发。 然后我看到以下错误:

Microsoft.Extensions.DependencyInjection.Abstractions:值不能为空。 (参数'implementationInstance')。

尝试在 Configure() 方法中注册自定义设置时,这在 Startup.cs 中失败:

        public override void Configure(IFunctionsHostBuilder builder)
        {
            ...
 
            config.Bind(settings);

            builder.Services.AddSingleton(settings);
            builder.Services.AddSingleton(settings.TwilioSettings);

            ...
        }

实例化的 IConfigurationRoot 对象 config 似乎没有 Azure 应用程序设置。

我在 Startup.cs 中缺少什么,以便将 Azure 中的应用程序设置输入 IConfigurationRoot?

您是否尝试过TwilioSetting:From格式?

来自https://docs.microsoft.com/en-us/azure/app-service/configure-common?tabs=portal

应用设置名称不能包含句点 (.)。 如果应用设置包含句点,则该句点将替换为容器中的下划线。

在默认 Linux 应用服务或自定义 Linux 容器中,应用设置名称(如 ApplicationInsights:InstrumentationKey)中的任何嵌套 JSON 键结构都需要在应用服务中配置为 ApplicationInsights__InstrumentationKey 作为键名称。 换句话说,任何 : 都应该替换为 __(双下划线)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM