GetConnectionStringOrSetting устарел? Какая лучшая замена?

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

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

Можете ли вы поделиться файлом конфигурации?

Harshitha 30.05.2024 13:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
98
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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"
  }
}

Выход:

  • Для получения дополнительных разъяснений по пакетам и конфигурациям обратитесь к этому DOC.
Ответ принят как подходящий
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];
}

Я просто украл одну статическую функцию, чтобы мне не пришлось переписывать все ее вызовы.

Другие вопросы по теме

Пользователи не могут пройти проверку подлинности в зоне доступности с помощью ConnectToAzure
Невозможно создать рабочую область машинного обучения Azure с помощью CLI
Фабрика данных Azure: как использовать Exists, когда источник (Blob - CSV) и цель (БД SQL) представляют собой массивные наборы данных (различные типы данных ~ 370 столбцов, ~ 7 миллионов строк)
Отключить локальную аутентификацию для Переводчика Azure
Перемещение пользователей из Azure AD B2C в Azure Cosmos DB
Невозможно установить параметры в веб-перехватчике учетной записи автоматизации Azure в Powershell
Android MsalClientException BrowserTabActivity отсутствует
Использование Facebook в качестве внешнего поставщика аутентификации для ASP.NET не удается при работе в Azure
Как темы тематического пространства и пространства имен связаны в Azure
Как создать массив concat внутри переменной для вывода активности поиска, повторяемый в цикле foreach