Azure App Configuration with Aspire on Local PC

In this exercise, I focused on only one Azure resource: Azure App Configuration. My goal was simple: run App Configuration locally as an emulator,
connect a console client project to it through .NET Aspire, and validate that the client can write and read configuration values end-to-end.

How it looks like

This is the App Configuration emulator view

How I wired Azure App Configuration in Aspire AppHost

In AzureEmulators/AppHost.cs, I added Azure App Configuration as an emulator and connected the client project to it.
I also assigned a role to the client project so it can manage configuration data.

  • App Configuration resource: azureAppConfig1
  • Client project: azureAppConfigClient1
  • Reference and startup dependency: WithReference(appConfig) + WaitFor(appConfig)
  • Role assignment: AppConfigurationDataOwner
var appConfig = builder.AddAzureAppConfiguration("azureAppConfig1")
    .RunAsEmulator()
    .ConfigureInfrastructure(appConfig =>
    {
        //var store=appConfig.GetProvisionableResources().OfType<AppConfigurationStore>().FirstOrDefault();
        //if (store == null) return;
        //store.DisableLocalAuth = true;

    })
    ;

builder.AddProject<Projects.AppConfigurationClient>("azureAppConfigClient1")
    .WithReference(appConfig)
    .WithRoleAssignments(appConfig, Azure.Provisioning.AppConfiguration.AppConfigurationBuiltInRole.AppConfigurationDataOwner)
    .WaitFor(appConfig)
    ;

What my AppConfigurationClient project does

In AppConfigurationClient/Program.cs, I implemented a startup flow to validate connectivity and perform basic configuration operations.

  • I scan environment variables and pick the App Configuration connection string.
  • I fail fast if the connection string is missing.
  • I configure ConfigurationClientOptions with a custom HTTP pipeline policy.
  • I remove the Authorization header per request/retry using RemoveAuthorizationHeaderPolicy.
  • I set one key-value pair: Name = Andrei.
  • I read back the same key to verify the value was persisted.

Code from my console client project

using Azure.Core;
using Azure.Core.Pipeline;
using Azure.Data.AppConfiguration;
using System.Collections;

Console.WriteLine("Hello,AzureAppConfiguration!");


string connectionStringAzureAppConfig = "";
foreach (var item in Environment.GetEnvironmentVariables().Cast<DictionaryEntry>())
{
    if (item.Key?.ToString()?.Contains("azureAppConfig") == true)
    {
        Console.WriteLine($"{item.Key}: {item.Value}");
        connectionStringAzureAppConfig = item.Value?.ToString() ?? string.Empty;
    }
}
if (string.IsNullOrWhiteSpace(connectionStringAzureAppConfig))
{
    Console.WriteLine("Azure App Configuration connection string is not set in environment variables.");
    return;
}

ConfigurationClientOptions clientOptions = new ConfigurationClientOptions();
clientOptions.AddPolicy(new RemoveAuthorizationHeaderPolicy(), HttpPipelinePosition.PerRetry);

Console.WriteLine($"Connection string for Azure App Configuration: {connectionStringAzureAppConfig}");
var client = new ConfigurationClient(connectionStringAzureAppConfig, clientOptions);
await client.SetConfigurationSettingAsync("Name","Andrei");
Console.WriteLine("Set configuration setting 'Name' to 'Andrei' in Azure App Configuration.");
var name = await client.GetConfigurationSettingAsync("Name");
Console.WriteLine($"Retrieved configuration setting 'Name' from Azure App Configuration: {name.Value}");


internal sealed class RemoveAuthorizationHeaderPolicy : HttpPipelinePolicy
{
    public override void Process(HttpMessage message, ReadOnlyMemory<HttpPipelinePolicy> pipeline)
    {
        message.Request.Headers.Remove("Authorization");
        ProcessNext(message, pipeline);
    }

    public override ValueTask ProcessAsync(HttpMessage message, ReadOnlyMemory<HttpPipelinePolicy> pipeline)
    {
        message.Request.Headers.Remove("Authorization");
        return ProcessNextAsync(message, pipeline);
    }
}

Output logs from my client project

Waiting for resource 'azureAppConfig1' to enter the 'Running' state.
Waiting for resource ready to execute for 'azureAppConfig1'.
Finished waiting for resource 'azureAppConfig1'.
Hello,AzureAppConfiguration!
ConnectionStrings__azureAppConfig1: Endpoint=http://localhost:49898;Id=anonymous;Secret=abcdefghijklmnopqrstuvwxyz1234567890;Anonymous=True
Connection string for Azure App Configuration: Endpoint=http://localhost:49898;Id=anonymous;Secret=abcdefghijklmnopqrstuvwxyz1234567890;Anonymous=True
Set configuration setting 'Name' to 'Andrei' in Azure App Configuration.
Retrieved configuration setting 'Name' from Azure App Configuration: (Name,Andrei)

What is achieved

  • I can run Azure App Configuration locally without provisioning the cloud resource.
  • I wired AppHost to AppConfigurationClient with reference + wait semantics.
  • I can write a configuration key and read it back from the client project.

More links

Azure App Configuration Get Started


Posted

in

, ,

by

Tags: