Tutorial: Uso de la configuración dinámica mediante una actualización de inserción en una aplicación de .NET Core
La biblioteca cliente para .NET Core de App Configuration admite la actualización de la configuración a petición sin provocar el reinicio de una aplicación. Se puede configurar una aplicación para que detecte cambios en App Configuration mediante uno de los dos métodos siguientes o ambos.
Modelo de sondeo: este es el comportamiento predeterminado, que usa el sondeo para detectar los cambios en la configuración. Una vez que el valor almacenado en caché de una configuración expira, la siguiente llamada a
TryRefreshAsyncoRefreshAsyncenvía una solicitud al servidor para comprobar si la configuración ha cambiado y extrae la configuración actualizada si es necesario.Modo de inserción: este modo utiliza eventos de App Configuration para detectar los cambios en la configuración. Una vez que App Configuration está configurado para enviar eventos de cambio de valor de clave a Azure Event Grid, la aplicación puede usar estos eventos para optimizar el número total de solicitudes necesarias para mantener la configuración actualizada. Las aplicaciones pueden optar por suscribirse a ellos directamente desde Event Grid o bien mediante uno de los controladores de eventos admitidos, como un webhook, una función de Azure o un tema de Service Bus.
Las aplicaciones pueden optar por suscribirse a estos eventos directamente desde Event Grid, mediante un webhook o mediante el reenvío de eventos a Azure Service Bus. El SDK de Azure Service Bus proporciona una API para registrar un controlador de mensajes que simplifica este proceso para las aplicaciones que no tienen un punto de conexión HTTP o que no desean sondear los cambios continuamente en Event Grid.
Este tutorial le muestra cómo puede implementar las actualizaciones de configuración dinámica en el código mediante una actualización de inserción. Se basa en la aplicación que se introdujo en los inicios rápidos. Antes de continuar, finalice primero el tutorial Creación de una aplicación .NET Core con Azure App Configuration.
Para realizar los pasos de este tutorial, puede usar cualquier editor de código. Visual Studio Code es una excelente opción que está disponible en las plataformas Windows, macOS y Linux.
En este tutorial, aprenderá a:
- Configurar una suscripción para enviar eventos de cambio de configuración desde App Configuration a un tema de Service Bus
- Configurar la aplicación de .NET Core para actualizar su configuración en respuesta a los cambios en App Configuration.
- Consuma en la aplicación la configuración más reciente.
Prerrequisitos
Para realizar este tutorial, instale el SDK de .NET Core.
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Configuración de un tema y una suscripción de Azure Service Bus
En este tutorial se usa la integración de Service Bus con Event Grid para simplificar la detección de cambios de configuración para las aplicaciones que no desean sondear los cambios de App Configuration de forma continua. El SDK de Azure Service Bus proporciona una API para registrar un controlador de mensajes que se puede usar para actualizar la configuración cuando se detectan cambios en App Configuration. Siga los pasos de Inicio rápido: Uso de Azure Portal para crear un tema de Service Bus y suscripciones a dicho tema para crear un espacio de nombres, un tema y una suscripción de Service Bus.
Una vez creados los recursos, agregue las siguientes variables de entorno. Se usarán para registrar un controlador de eventos para los cambios de configuración en el código de la aplicación.
| Key | Valor |
|---|---|
| ServiceBusConnectionString | Cadena de conexión para el espacio de nombres de Service Bus |
| ServiceBusTopic | Nombre del tema de Service Bus |
| ServiceBusSubscription | Nombre de la suscripción de Service Bus |
Configuración de la suscripción a eventos
Abra el recurso de App Configuration en Azure Portal y, a continuación, haga clic en
+ Event Subscription(+ Suscripción de eventos) en el panelEvents(Eventos).
Escriba un nombre para los campos
Event Subscription(Suscripción de eventos) ySystem Topic(Tema del sistema).
Seleccione
Endpoint Type(Tipo de punto de conexión) comoService Bus Topic(Tema de Service Bus), seleccione el tema de Service Bus y, a continuación, haga clic enConfirm Selection(Confirmar selección).
Haga clic en
Create(Crear) para crear la suscripción de eventos.Haga clic en
Event Subscriptions(Suscripciones de eventos) en el panelEvents(Eventos) para asegurarse de que la suscripción se haya creado correctamente.
Nota
Al suscribirse a los cambios de configuración, se pueden usar uno o varios filtros para reducir el número de eventos que se envían a la aplicación. Se pueden configurar como filtros de suscripción de Event Grid o filtros de suscripción de Service Bus. Por ejemplo, un filtro de suscripción se puede utilizar para suscribirse solo a eventos de cambios en una clave que empieza por una cadena específica.
Registro del controlador de eventos para volver a cargar los datos de App Configuration
Abra Program.cs y actualice el archivo con el código siguiente.
using Microsoft.Azure.ServiceBus;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
using System;
using System.Diagnostics;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace TestConsole
{
class Program
{
private const string AppConfigurationConnectionStringEnvVarName = "AppConfigurationConnectionString"; // e.g. Endpoint=https://{store_name}.azconfig.io;Id={id};Secret={secret}
private const string ServiceBusConnectionStringEnvVarName = "ServiceBusConnectionString"; // e.g. Endpoint=sb://{service_bus_name}.servicebus.windows.net/;SharedAccessKeyName={key_name};SharedAccessKey={key}
private const string ServiceBusTopicEnvVarName = "ServiceBusTopic";
private const string ServiceBusSubscriptionEnvVarName = "ServiceBusSubscription";
private static IConfigurationRefresher _refresher = null;
static async Task Main(string[] args)
{
string appConfigurationConnectionString = Environment.GetEnvironmentVariable(AppConfigurationConnectionStringEnvVarName);
IConfiguration configuration = new ConfigurationBuilder()
.AddAzureAppConfiguration(options =>
{
options.Connect(appConfigurationConnectionString);
options.ConfigureRefresh(refresh =>
refresh
.Register("TestApp:Settings:Message")
.SetCacheExpiration(TimeSpan.FromDays(30)) // Important: Reduce poll frequency
);
_refresher = options.GetRefresher();
}).Build();
RegisterRefreshEventHandler();
var message = configuration["TestApp:Settings:Message"];
Console.WriteLine($"Initial value: {configuration["TestApp:Settings:Message"]}");
while (true)
{
await _refresher.TryRefreshAsync();
if (configuration["TestApp:Settings:Message"] != message)
{
Console.WriteLine($"New value: {configuration["TestApp:Settings:Message"]}");
message = configuration["TestApp:Settings:Message"];
}
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
private static void RegisterRefreshEventHandler()
{
string serviceBusConnectionString = Environment.GetEnvironmentVariable(ServiceBusConnectionStringEnvVarName);
string serviceBusTopic = Environment.GetEnvironmentVariable(ServiceBusTopicEnvVarName);
string serviceBusSubscription = Environment.GetEnvironmentVariable(ServiceBusSubscriptionEnvVarName);
SubscriptionClient serviceBusClient = new SubscriptionClient(serviceBusConnectionString, serviceBusTopic, serviceBusSubscription);
serviceBusClient.RegisterMessageHandler(
handler: (message, cancellationToken) =>
{
string messageText = Encoding.UTF8.GetString(message.Body);
JsonElement messageData = JsonDocument.Parse(messageText).RootElement.GetProperty("data");
string key = messageData.GetProperty("key").GetString();
Console.WriteLine($"Event received for Key = {key}");
_refresher.SetDirty();
return Task.CompletedTask;
},
exceptionReceivedHandler: (exceptionargs) =>
{
Console.WriteLine($"{exceptionargs.Exception}");
return Task.CompletedTask;
});
}
}
}
El método SetDirty se usa para establecer el valor almacenado en caché para los pares de clave y valor registrados para la actualización como modificados. Esto garantiza que la siguiente llamada a RefreshAsync o TryRefreshAsync vuelva a validar los valores almacenados en caché con App Configuration y los actualice si es necesario.
Se agrega un retraso aleatorio antes de que el valor almacenado en caché se marque como modificado para reducir la limitación potencial en caso de que varias instancias se actualicen al mismo tiempo. El retraso máximo predeterminado antes de que el valor almacenado en caché se marque como modificado es de 30 segundos, pero se puede invalidar mediante el paso del parámetro opcional TimeSpan al método SetDirty.
Nota
Para reducir el número de solicitudes a App Configuration cuando se usa la actualización de inserción, es importante llamar a SetCacheExpiration(TimeSpan cacheExpiration) con un valor adecuado del parámetro cacheExpiration. Esto controla el tiempo de expiración de la memoria caché para la actualización de extracción y se puede usar como una red de seguridad en caso de que haya un problema con la suscripción de eventos o la suscripción de Service Bus. TimeSpan.FromDays(30) es el valor recomendado.
Compilación y ejecución de la aplicación en un entorno local
Establezca una variable de entorno llamada AppConfigurationConnectionString y defínala como la clave de acceso al almacén de App Configuration. Si usa el símbolo del sistema de Windows, ejecute el siguiente comando y reinícielo para que se aplique el cambio:
setx AppConfigurationConnectionString "connection-string-of-your-app-configuration-store"Si usa Windows PowerShell, ejecute el siguiente comando:
$Env:AppConfigurationConnectionString = "connection-string-of-your-app-configuration-store"Si usa macOS o Linux, ejecute el siguiente comando:
export AppConfigurationConnectionString='connection-string-of-your-app-configuration-store'Ejecute el siguiente comando para compilar la aplicación de consola:
dotnet buildUna vez que la compilación se haya realizado correctamente, ejecute el siguiente comando para ejecutar la aplicación localmente:
dotnet run
Inicie sesión en Azure Portal. Seleccione Todos los recursos y seleccione la instancia de almacén de App Configuration que creó en el inicio rápido.
Seleccione Explorador de configuración y actualice los valores de las claves siguientes:
Clave Value TestApp:Settings:Message Datos de Azure App Configuration, actualizados Espere 30 segundos para permitir que se procese el evento y se actualice la configuración.

Limpieza de recursos
Si no desea seguir usando los recursos creados en este artículo, elimine el grupo de recursos que creó aquí para evitar cargos.
Importante
La eliminación de un grupo de recursos es irreversible. El grupo de recursos y todos los recursos que contiene se eliminan permanentemente. Asegúrese de no eliminar por accidente el grupo de recursos o los recursos equivocados. Si creó los recursos para este artículo en un grupo de recursos que contenga los recursos que desee conservar, elimine cada recurso de forma individual desde su panel respectivo, en lugar de eliminar el grupo de recursos.
- Inicie sesión en Azure Portal y después seleccione Grupos de recursos.
- En el cuadro de texto Filtrar por nombre, escriba el nombre del grupo de recursos.
- En la lista resultados, seleccione el nombre del grupo de recursos para ver la información general.
- Seleccione Eliminar grupo de recursos.
- Se le pedirá que confirme la eliminación del grupo de recursos. Escriba el nombre del grupo de recursos para confirmar y seleccione Eliminar.
Transcurridos unos instantes, el grupo de recursos y todos sus recursos se eliminan.
Pasos siguientes
En este tutorial, ha habilitado la aplicación de .NET Core para actualizar dinámicamente la configuración a partir de App Configuration. Para obtener información sobre cómo usar una identidad administrada de Azure para simplificar el acceso a App Configuration, vaya al siguiente tutorial.