Azure 函数配置值在函数属性中不可用

问题描述 投票:0回答:1

我有一个在 Azure 门户中运行的 Azure 函数。其配置驻留在配置资源中,某些值位于密钥保管库资源中。 Azure Function 是在 .NET 6 中使用进程内模型实现的。我使用隔离工作模型将代码迁移到 .NET 8。

这是我的 Program.cs 代码:

using System.Reflection;
using Azure.Identity;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace My.AzureFunctions
{
    public class Program
    {
        public static void Main()
        {
            var host = new HostBuilder()
                .ConfigureFunctionsWebApplication()
                .ConfigureAppConfiguration(config =>
                {
                    var builtConfig = config.Build();
                    var appConfigurationName = builtConfig
                    
                    var defaultAzureCredentialOptions = new DefaultAzureCredentialOptions
                    {
                        ExcludeAzureCliCredential = false,
                        ExcludeAzurePowerShellCredential = true,
                        ExcludeEnvironmentCredential = false,
                        ExcludeManagedIdentityCredential = false,
                        ExcludeVisualStudioCodeCredential = true,
                        ExcludeVisualStudioCredential = true
                    };
                    config.AddAzureAppConfiguration(options =>
                    {
                        options.Connect(new Uri($"https://{appConfigurationName}.azconfig.io"),
                        new DefaultAzureCredential(defaultAzureCredentialOptions))
                            .ConfigureKeyVault(kvOptions =>
                            {
                                kvOptions.SetCredential(
                                    new DefaultAzureCredential(defaultAzureCredentialOptions));
                                kvOptions.SetSecretRefreshInterval(TimeSpan.FromHours(1));
                            });
                    });
                    config.AddEnvironmentVariables();

                    foreach (var kvp in config.Build().AsEnumerable())
                    {
                        if (!string.IsNullOrEmpty(kvp.Value))
                        {
                            Environment.SetEnvironmentVariable(kvp.Key, kvp.Value);
                        }
                    }
                })
                .ConfigureServices((context, services) =>
                {
                    // Bind configurations to options
                    // ...
                })
                .Build();

            host.Run();
        }
    }
}

函数如下所示:

    [Function("TestTimerTrigger")]
    public void TestTimerTrigger(
        // This causes an error
        [TimerTrigger("%TimeValue%)] TimerInfo timerInfo,
        FunctionContext functionContext,
        CancellationToken cancellationToken)
    {
        // Here TimeValue residing in Azure Configuration can be read.
        _logger.LogInformation("TestTimerTrigger function executed with: {TimeValue}", _configuration["TimeValue"]);

        // Also accessible here
        _logger.LogInformation("TestTimerTrigger function executed with: {TimeValue}", Environment.GetEnvironmentVariable("TimeValue"));
    }

    [Function("MyEventTrigger")]
    // The value cannot be read here, either.
    public async Task Run([EventHubTrigger("", Connection = "MyEventHub:ConnectionString")] EventData[] messages, 
        FunctionContext functionContext)
    {
        // ...
    }

我收到这些错误:

The 'TestTimerTrigger' function is in error: Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.TestTimerTrigger'. Microsoft.Azure.WebJobs.Host: '%TimeValue%' does not resolve to a value.

Microsoft.Azure.WebJobs.Extensions.EventHubs: EventHub account connection string with name 'MyEventHub:ConnectionString' does not exist in the settings. Make sure that it is a defined App Setting.

在旧的 .NET 6 进程内模型函数中,我可以访问函数属性中的配置值,但将代码更改为 .NET 8 和隔离工作模型后,我遇到了所描述的问题。配置本身和访问它的方式没有改变。我做错了什么?

c# azure-functions .net-8.0 azure-functions-isolated azure-configuration
1个回答
0
投票

我也遇到了类似的问题,据我所知,孤立地,这些值没有显示在应用程序设置中。您可以直接在应用程序设置中添加应用程序配置密钥(无值),而不是使用 Program.cs 中的代码连接到 Azure 应用程序配置,如下所示:

enter image description here

我在这里补充:

@Microsoft.AppConfiguration(Endpoint=https://rithwik98.azconfig.io; Key=rithcron)

这里 rithcron 是应用程序配置服务中的键名,rithwik98 是服务名称:

enter image description here

现在函数应用程序运行:

enter image description here

要实现此功能,您需要启用功能应用程序的托管身份,并将应用程序配置数据读取者/所有者角色授予功能应用程序托管身份

© www.soinside.com 2019 - 2024. All rights reserved.