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
ConfigurationClientOptionswith a custom HTTP pipeline policy. - I remove the
Authorizationheader per request/retry usingRemoveAuthorizationHeaderPolicy. - 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.