В прошлом при разработке функции Azure, запускаемой по таймеру, я использовал GetConnectionStringOrSetting из Microsoft.Extensions.Configuration для загрузки строк подключения, секретов и обычных настроек. Не имело значения, где они жили, оно их нашло.
Но я больше не уверен, что мне стоит переходить на .NET 8? Похоже, это зависит от стандарта .NET и больше не работает с Microsoft.Extensions.Configuration.UserSecrets для загрузки секретов из защищенной папки при локальной разработке.





GetConnectionStringOrSetting устарел?
В .NET 8 избегайте использования GetConnectionStringOrSetting и вместо этого используйте интерфейс IConfiguration, предоставляемый Microsoft.Extensions.Configuration, для доступа к настройкам конфигурации, чтобы обеспечить совместимость с секретами пользователя, переменными среды и файлами конфигурации.
Я попробовал использовать приведенный ниже код, используя GetConnectionStringOrSetting, но это не сработало должным образом.
Для чтения из appsettings.json, переменных среды и секретов пользователя. проверьте ниже пример конфигурации
Программа.cs:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureAppConfiguration((context, config) =>
{
var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
config.AddUserSecrets<Program>();
config.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true);
}
})
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.Build();
host.Run();
Для доступа к настройкам конфигурации в функции используйте IConfiguration.
Функция1.cs:
using System;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace FunctionApp449034
{
public class Function1
{
private readonly ILogger _logger;
private readonly IConfiguration _configuration;
public Function1(ILoggerFactory loggerFactory, IConfiguration configuration)
{
_logger = loggerFactory.CreateLogger<Function1>();
_configuration = configuration;
}
[Function("Function1")]
public void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer)
{
_logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
var connectionString = _configuration["MyDatabase"];
var secretValue = _configuration["MySecret"];
_logger.LogInformation($"Database Connection String: {connectionString}");
_logger.LogInformation($"Secret Value: {secretValue}");
if (myTimer.ScheduleStatus is not null)
{
_logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}");
}
}
}
}
локальные.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"MyDatabase": "AccountEndpoint=https://pbazcdb.documents.azure.com:443/;AccountKey=sDhoF3BT060Ux5tpM4heCT7MSVT8BrDFmgFRTsBNRZbCpQIRS494sACDbM1GnUg==;",
"MySecret": "simple"
}
}
Выход:

public static class IConfigurationExtensions
{
/// <summary>
/// Looks for a connection string by first checking the ConfigurationStrings section, and then the root.
/// </summary>
/// <param name = "configuration">The configuration.</param>
/// <param name = "connectionName">The connection string key.</param>
/// <returns></returns>
public static string GetConnectionStringOrSetting(this IConfiguration configuration, string connectionName) =>
configuration.GetConnectionString(connectionName) ?? configuration[connectionName];
}
Я просто украл одну статическую функцию, чтобы мне не пришлось переписывать все ее вызовы.
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Можете ли вы поделиться файлом конфигурации?