Skip to content

Adding JsonStream to the IConfigurationBuilder causes InvalidOperationException #19

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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