Skip to content

Adding JsonStream to the IConfigurationBuilder causes InvalidOperationException #19

@goodstas

Description

@goodstas

Hello,
I have asp.net application (.NET 8).
I have regular application's appsettings.json file in it.
I try to read from the remote server some configuration sections which are stored as JSON and to add them to the ConfigurarationManager.
So i created some extension method which i call in Program.cs :

public static void LoadConfiguration(this IConfigurationBuilder configBuilder)
 {
     var configFilePath = @"appsettings2.json";

     if (File.Exists(configFilePath))
     {
         var fileContent = File.ReadAllText(configFilePath);

         using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(fileContent));
         configBuilder.AddJsonStream(stream);
     }

     configBuilder.AddEnvironmentVariables();

     **configBuilder.EnableSubstitutions("$(", ")");**
 }

For this example i just read the json string from another file.

When i run my application i get an exception in the last line with EnableSubstitutions.
As you can see i call EnableSubstitutions in the end when i finished building my configuration.

Exception message is "StreamConfigurationProviders cannot be loaded more than once."

The stack trace of the exception :

   at Microsoft.Extensions.Configuration.StreamConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at ConfigurationSubstitution.ChainedSubstitutedConfigurationRoot.<>c__DisplayClass1_0.<.ctor>b__0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at ConfigurationSubstitution.ChainedSubstitutedConfigurationRoot.GetReloadToken()
   at ConfigurationSubstitution.ChainedSubstitutedConfigurationProvider.GetReloadToken()
   at Microsoft.Extensions.Primitives.ChangeToken.ChangeTokenRegistration`1..ctor(Func`1 changeTokenProducer, Action`1 changeTokenConsumer, TState state)
   at Microsoft.Extensions.Primitives.ChangeToken.OnChange(Func`1 changeTokenProducer, Action changeTokenConsumer)
   at Microsoft.Extensions.Configuration.ConfigurationManager.AddSource(IConfigurationSource source)
   at Microsoft.Extensions.Configuration.ConfigurationManager.Microsoft.Extensions.Configuration.IConfigurationBuilder.Add(IConfigurationSource source)
   at ConfigurationSubstitution.IConfigurationBuilderExtensions.EnableSubstitutions(IConfigurationBuilder builder, ConfigurationSubstitutor substitutor)
   at ConfigurationSubstitution.IConfigurationBuilderExtensions.EnableSubstitutions(IConfigurationBuilder builder, String substitutableStartsWith, String substitutableEndsWith, UnresolvedVariableBehaviour unresolvedVariableBehaviour)
   at System.LoadConfigurationExtension.LoadConfiguration(IConfigurationBuilder configBuilder) in C:\GIT\WebApplicationConfSubstitute\LoadConfigurationExtension.cs:line 22
   at Program.<Main>$(String[] args) in C:\GIT\WebApplicationConfSubstitute\Program.cs:line 3

I would appreciate for any help to understand what i did wrong and what is a way to do what i want or it's a bug?
Thank you.
@molinch @a-alamoudi @regnrat @MickaJsd

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions