我有一个在 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 和隔离工作模型后,我遇到了所描述的问题。配置本身和访问它的方式没有改变。我做错了什么?
我也遇到了类似的问题,据我所知,孤立地,这些值没有显示在应用程序设置中。您可以直接在应用程序设置中添加应用程序配置密钥(无值),而不是使用 Program.cs 中的代码连接到 Azure 应用程序配置,如下所示:
我在这里补充:
@Microsoft.AppConfiguration(Endpoint=https://rithwik98.azconfig.io; Key=rithcron)
这里 rithcron 是应用程序配置服务中的键名,rithwik98 是服务名称:
现在函数应用程序运行:
要实现此功能,您需要启用功能应用程序的托管身份,并将应用程序配置数据读取者/所有者角色授予功能应用程序托管身份