Skip to content

New Feature - Merge configuration files #296

@AaronFixer

Description

@AaronFixer

Expected Behavior / New Feature

This may already be a feature but I see no mention of it in the documentation and it isn't working in my project.

It would be good to support multiple .json files, potentially with better naming conventions. I have an app with a number of services and routes, and it would be nice to separate them out into dedicated files rather then have one huge configuration.json.

For example:

  • AccountRoutes.json <- Would have all routes for the account controller/service
  • ComponentActions.json <- Would have all the routes for component actions controller/service

etc. etc.

Is this already possible? It seems that when I define multiple .AddJsonFile() it only picks up the routes in the last file it pinks up with the ReRoutes field.

Activity

changed the title [-]Supporting multiple *.json files?[/-] [+]Supporting multiple json route files?[/+] on Mar 29, 2018
changed the title [-]Supporting multiple json route files?[/-] [+]New Feature - Merge configuration files[/+] on Mar 29, 2018
added
medium effortLikely a few days of development effort
help wantedNot actively being worked on. If you plan to contribute, please drop a note.
on Mar 29, 2018
TomPallister

TomPallister commented on Mar 29, 2018

@TomPallister
Member

@AaronFixer thanks for your interest in the project!

This feature isn't supported yet I will but it on the backlog but if you would like to have a go yourself please feel free to submit a PR.

There are a couple of considerations here.

  1. Ocelot uses configuration.json as a database so a solution would need to take multiple files and merge them into configuration.json or have a second file that ocelot uses as a database (not sure I like this).

  2. Been thinking about this for a while completely change how configuration works. I was thinking of making it more like identity server where it is provided statically in c# / database.

  3. You could just do this yourself in ConfigureAppConfiguration with something like below and it would not need to be part of Ocelot.

.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    merger.Merge();
      
                    config
                        .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                        .AddJsonFile("configuration.json");
                })

I think 1 and 3 are better options at the moment for me but that could change!

Anyway let me know if you want to give this a try and I will be of as much assistance as I can...otherwise I'm afraid you will have to wait a bit for the feature :(

AaronFixer

AaronFixer commented on Mar 29, 2018

@AaronFixer
Author

For me this is definitely something I think I (and many others) could potentially benefit from with large projects wanting to use a Gateway!

I'll have to do this in my spare time, although I don't imagine it should take too long.

1 and 3 both work. 3 is something I could just use for the time being as a workaround. I'll see if I get a chance to work on a PR for 1. in the meantime.

Thanks for getting back to me!

TomPallister

TomPallister commented on Mar 29, 2018

@TomPallister
Member

Yep I agree this would be a useful feature! If you don't get round to it its on my list and I expect to do it in the next months or so.

added 5 commits that reference this issue on Apr 14, 2018
added a commit that references this issue on Apr 17, 2018

15 remaining items

Faisal-developer

Faisal-developer commented on Apr 29, 2020

@Faisal-developer

@zhutoutou use this

   public static IHostBuilder CreateHostBuilder(string[] args) =>
                 Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
                          {
                              config.AddOcelot("Routes", hostingContext.HostingEnvironment);
                              config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                                    .AddJsonFile("ocelot.json",true)
                                    .AddEnvironmentVariables();
                          })
                         .ConfigureServices(services =>
                         {
                             services.AddOcelot();
                         })
                        .Configure(app =>
                        {
                            //app.UseRouting();
                            //app.UseEndpoints(endpoints => {
                            //    endpoints.MapControllers();
                            //});
                            app.UseOcelot().Wait();
NicoJuicy

NicoJuicy commented on Jan 28, 2021

@NicoJuicy

@Faisal-developer commented on Apr 29, 2020

A bit better formatting, it wasn't clear what changed to me ( fyi it's the part with wrapping ConfigureAppConfiguration with ConfigureWebHostDefaults:

      Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
            .ConfigureWebHostDefaults(webBuilder =>//new for .net core 3
            {
                webBuilder.UseUrls("https://*:44326")
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                    //  .AddJsonFile("gateway/v1/orders.json"
                    //.AddJsonFile("gateway/v1/shipping.json") //this won't work to load multiple configs
                    .AddEnvironmentVariables()
                    .AddOcelot("gateway/v1", hostingContext.HostingEnvironment); //loads multiple configurations : https://github.com/ThreeMammals/Ocelot/issues/1047
                });  
            })  
            //old way. Gives an error in .net core 3.0
            //.ConfigureAppConfiguration((hostingContext, config) =>
            // {
            //           config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            //           .AddJsonFile("gateway/v1/orders.json"
            //});
deleted a comment from Flave1 on Nov 10, 2023
deleted a comment from zhutoutou on Nov 11, 2023
raman-m

raman-m commented on Nov 11, 2023

@raman-m
Member

@CesarD commented on Jun 21, 2019
@CesarD commented on Jun 21, 2019

Hi César!
Are you still with Ocelot?
FYI #1183

CesarD

CesarD commented on Nov 11, 2023

@CesarD

@raman-m commented on Nov 11, 2023

No, sorry, I moved onto bla-bla since quite a while ago.

raman-m

raman-m commented on Nov 11, 2023

@raman-m
Member

@CesarD LoL It is OK that you've moved to another gateway.
I found your past comments really valuable, and we can include these requirements as extra ones to #651 and #1183

CesarD

CesarD commented on Nov 11, 2023

@CesarD

Yeah, sorry, is just that for a couple years there was no movement and it was difficult to justify implementing Ocelot while there was another MS-backed project doing similar stuff and being actively developed... 😅

raman-m

raman-m commented on Nov 11, 2023

@raman-m
Member

@CesarD Hmm... Bla-bla gateway can merge configuration files, right? If Yes, could you share links to me plz?
This article? Multiple Configuration Sources

Don't you mind if I invite you to review the code and features of PR #1183 in a week?

CesarD

CesarD commented on Nov 11, 2023

@CesarD

Well, bla-bla gateway doesn't require to load the configuration from a specific file or type of files, you can very well have its config in the appsettings.json directly and you just need to specifiy the section where you want to pull the config from... If you want to load extra files into the configuration it's up to you, as long as the files don't overlap same configurations between each other, so it provides another kind of flexibility that I got used to.
Perhaps you can adapt Ocelot likewise...

BTW, I don't mind being invited for review 😉

raman-m

raman-m commented on Nov 18, 2023

@raman-m
Member

@CesarD commented on Nov 11
being actively developed...

Aha! Especially when you have a team of 3+ full time senior developers on-site at Microsoft with bla-bla salaries. 😛


@CesarD commented on Nov 11
config in the appsettings.json

Yeap! Ocelot has strange design of configuration feature based on ocelot.json file. We will discuss and plan to migrate to appsettings.json with significant refactoring of Configuration feature. Current design is ugly, and developers are confused that they must write special files to configure app instead of well-known ASP.NET approach to use appsettings.json.

added
ConfigurationOcelot feature: Configuration
and removed
help wantedNot actively being worked on. If you plan to contribute, please drop a note.
medium effortLikely a few days of development effort
on Apr 28, 2025
added theissue type on Apr 28, 2025
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

    ConfigurationOcelot feature: ConfigurationfeatureA new feature

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @NicoJuicy@CesarD@TomPallister@raman-m@zhutoutou

      Issue actions

        New Feature - Merge configuration files · Issue #296 · ThreeMammals/Ocelot