Учебник. Использование динамической конфигурации в веб-приложении ASP.NET (.NET Framework)

Данные из Конфигурации приложений можно загрузить в приложение .NET Framework в виде параметров. Дополнительные сведения см. в кратком руководстве. Но в .NET Framework параметры приложения могут обновляться только после перезапуска приложения. Поставщик .NET для Конфигурации приложений — это библиотека .NET Standard. Она поддерживает динамическое кэширование и обновление конфигурации без перезапуска приложения. В этом учебнике описывается, как реализовать динамические обновления конфигурации в приложении ASP.NET Web Forms. Такой же подход применим к приложениям MVC .NET Framework.

В этом руководстве описано следующее:

  • настройка веб-приложения ASP.NET на обновление конфигурации при изменении данных в хранилище Конфигурации приложений;
  • внедрение последней конфигурации в запросы к приложению.

Предварительные требования

Добавление ключей и значений

Добавьте следующие значения "ключ-ключ" в хранилище Конфигурация приложений и оставьте Метка и Тип контента значения по умолчанию. Дополнительные сведения о добавлении "ключ-значение" в хранилище с помощью портал Azure или CLI см. в статье Создание ключа-значения.

Ключ Значение
TestApp:Settings:BackgroundColor Белый
TestApp:Settings:FontColor Черный
TestApp:Settings:FontSize 40
TestApp:Settings:FontSize Данные из конфигурации приложения Azure
TestApp:Settings:Sentinel Версия 1

Создание веб-приложения ASP.NET

  1. Запустите Visual Studio и щелкните Создать проект

  2. Выберите Веб-приложение ASP.NET (.NET Framework) с C# из списка шаблонов проекта и нажмите Далее.

  3. В окне Настроить новый проект введите имя проекта. В разделе Платформа выберите .NET Framework 4.7.2 или более позднюю версию. Нажмите кнопку Создать.

  4. В разделе Создание веб-приложения ASP.NET выберите Web Forms. Нажмите кнопку Создать.

Перезагрузка данных из App Configuration

  1. Щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet. На вкладке Обзор найдите и добавьте в проект последнюю версию следующего пакета NuGet.

    Microsoft.Extensions.Configuration.AzureAppConfiguration

  2. Откройте файл Global.asax.cs и добавьте следующие пространства имен.

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    
  3. Добавьте следующие статические переменные-члены в класс Global.

    public static IConfiguration Configuration;
    private static IConfigurationRefresher _configurationRefresher;
    
  4. Добавьте метод Application_Start в класс Global. Если метод уже существует, добавьте в него следующий код.

    protected void Application_Start(object sender, EventArgs e)
    {
        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                    // Load all keys that start with `TestApp:` and have no label.
                    .Select("TestApp:*")
                    // Configure to reload configuration if the registered key 'TestApp:Settings:Sentinel' is modified.
                    .ConfigureRefresh(refresh => 
                    {
                        refresh.Register("TestApp:Settings:Sentinel", refreshAll:true)
                               .SetCacheExpiration(new TimeSpan(0, 5, 0));
                    });
            _configurationRefresher = options.GetRefresher();
        });
    
        Configuration = builder.Build();
    }
    

    Метод Application_Start вызывается при первом запросе к веб-приложению. Он вызывается только единожды за время жизненного цикла приложения. Поэтому здесь лучше всего инициализировать объект IConfiguration и загрузить данные из Конфигурации приложений.

    В методе ConfigureRefresh для отслеживания изменений регистрируется ключ в хранилище Конфигурации приложений. Параметр refreshAll метода Register указывает, что при изменении зарегистрированного ключа нужно обновлять все значения конфигурации. В этом примере ключ TestApp:Settings:Sentinel является ключом Sentinel, который обновляется только после изменения всех других ключей. При обнаружении изменения приложение обновляет все значения конфигурации. Такой подход обеспечивает согласованность конфигурации в приложении по сравнению с мониторингом всех ключей на наличие изменений.

    Метод SetCacheExpiration указывает минимальное время, которое должно пройти, прежде чем будет выполнен новый запрос в службу "Конфигурация приложений" для проверки на наличие каких-либо изменений конфигурации. В этом примере вы переопределяете срок действия по умолчанию (30 секунд), установив 5-минутный интервал. За счет этого сокращается количество запросов к хранилищу службы "Конфигурация приложений".

  5. Добавьте метод Application_BeginRequest в класс Global. Если метод уже существует, добавьте в него следующий код.

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        _ = _configurationRefresher.TryRefreshAsync();
    }
    

    Вызов одного метода ConfigureRefresh не приведет к автоматическому обновлению конфигурации. Метод TryRefreshAsync вызывается в начале каждого запроса для обозначения обновления. Это гарантирует, что приложение будет отправлять запросы к Конфигурации приложений только при активном получении запросов.

    Вызов TryRefreshAsync является холостым до завершения заданного времени истечения срока действия кэша, поэтому его влияние на производительность минимально. При выполнении запроса к Конфигурации приложений конфигурация обновляется асинхронно без блокировки выполнения текущего запроса, так как вам не требуется ожидать выполнения задачи. Возможно, текущий запрос не получит обновленные значения конфигурации, но это точно сделают последующие запросы.

    Даже в случае сбоя вызова TryRefreshAsync по какой-либо причине ваше приложение продолжит использовать кэшированную конфигурацию. После завершения настроенного времени истечения срока действия кэша будет предпринята еще одна попытка, после чего вызов TryRefreshAsync будет активирован новым запросом к приложению.

Использование последних данных конфигурации

  1. Откройте файл Default.aspx и замените его содержимое следующим. Убедитесь, что атрибут Inherits соответствует пространству имен и имени класса для вашего приложения.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebFormApp.Default" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Azure App Configuration Web Forms Demo</title>
    </head>
    <body id="body" runat="server">
        <form id="form1" runat="server">
            <div style="text-align: center">
                <asp:Label ID="message" runat="server" />
            </div>
        </form>
    </body>
    </html>
    
  2. Откройте файл Default.aspx.cs и добавьте в него следующий код.

    using System;
    using System.Web.UI.WebControls;
    
    namespace WebFormApp
    {
        public partial class Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                // Read configuration from the IConfiguration object loaded from Azure App Configuration
                string messageText = Global.Configuration["TestApp:Settings:Message"] ?? "Please add the key \"TestApp:Settings:Message\" in your Azure App Configuration store.";
                string messageFontSize = Global.Configuration["TestApp:Settings:FontSize"] ?? "20";
                string messageFontColor = Global.Configuration["TestApp:Settings:FontColor"] ?? "Black";
                string backgroundColor = Global.Configuration["TestApp:Settings:BackgroundColor"] ?? "White";
    
                message.Text = messageText;
                message.Font.Size = FontUnit.Point(int.Parse(messageFontSize));
                message.ForeColor = System.Drawing.Color.FromName(messageFontColor);
                body.Attributes["bgcolor"] = backgroundColor;
            }
        }
    }
    

Создание и запуск приложения

  1. Задайте переменную среды с именем ConnectionString для строки подключения ключа только для чтения, полученную при создании хранилища Конфигурации приложений.

    При использовании командной строки Windows выполните следующую команду:

    setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    Если вы используете Windows PowerShell, выполните следующую команду:

    $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    
  2. Перезапустите Visual Studio, чтобы изменение вступило в силу.

  3. Нажмите клавиши CTRL+F5, чтобы выполнить сборку и запуск веб-приложения.

    Локальный запуск приложения

  4. На портале Azure перейдите в обозреватель конфигураций хранилища Конфигурации приложений и измените значение следующих ключей. Ключ TestApp:Settings:Sentinel нужно изменить последним.

    Ключ Значение
    TestApp:Settings:BackgroundColor Зеленый
    TestApp:Settings:FontColor LightGray
    TestApp:Settings:FontSize Данные из Azure App Configuration — теперь с обновлениями в реальном времени!
    TestApp:Settings:Sentinel Версия 2
  5. Обновите страницу браузера, чтобы просмотреть новые параметры конфигурации. Возможно, это потребуется сделать несколько раз для отражения изменений. Или же измените срок действия кэша на значение, не превышающее 5 мин.

    Локальное обновление приложения

Примечание

Пример кода, используемый в этом учебнике, можно скачать в репозитории GitHub для службы "Конфигурация приложений Azure".

Очистка ресурсов

Если вы не планируете в дальнейшем использовать ресурсы, созданные при работе с этой статьей, удалите созданную группу ресурсов, чтобы избежать расходов.

Важно!

Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все содержащиеся в ней ресурсы удаляются без возможности восстановления. Будьте внимательны, чтобы случайно не удалить не те ресурсы или группу ресурсов. Если ресурсы для работы с этой статьей созданы в группе ресурсов, которая содержит другие нужные ресурсы, удалите каждый ресурс отдельно в соответствующей области ресурса, чтобы не удалять группу ресурсов.

  1. Войдите на портал Azure и выберитеГруппы ресурсов.
  2. Введите имя группы ресурсов в поле Фильтровать по имени.
  3. В списке результатов выберите имя группы ресурсов, чтобы просмотреть общие сведения.
  4. Выберите Удалить группу ресурсов.
  5. Подтвердите операцию удаления группы ресурсов. Введите имя группы ресурсов, которую необходимо удалить, и нажмите Удалить.

Через некоторое время группа ресурсов и все ее ресурсы будут удалены.

Дальнейшие действия

В рамках этого учебника вы включили в веб-приложении ASP.NET Web Forms динамическое обновление параметров конфигурации из службы "Конфигурация приложений". Чтобы узнать, как включить динамическую конфигурацию в приложении .NET Framework, перейдите к следующему учебнику:

Чтобы узнать, как с помощью удостоверения, управляемого Azure, упростить доступ к службе "Конфигурация приложений", перейдите к следующему учебнику: