【问题标题】:Unable to add custom settings file to Asp.Net Core 3.1 WebApi无法将自定义设置文件添加到 Asp.Net Core 3.1 WebApi
【发布时间】:2020-02-17 10:42:17
【问题描述】:

我正在编写一个 WebApi 来跟踪我的小狗的行为(如厕时间、板条箱训练等)。该 api 有一个用 Blazor 编写的前端组件,但这不是这个问题的一部分。

在我的 github 项目中,我从不使用 appsettings.json 文件,因为担心不小心提交它并因此暴露任何秘密。相反,我想像这样添加我自己的 appsettings 文件:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(config => {
                    var basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                    var fileName = "puppytrackersettings.json";
                    var fullPath = Path.Combine(basePath, fileName);

                    if(File.Exists(fullPath))
                    {
                        config.SetBasePath(basePath);
                        config.AddJsonFile(fileName, optional: true);
                    }
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

这样,设置文件可以保存在“我的文档”文件夹(Linux 上的“/”)中,远离源代码。

问题
问题是配置仅在 CreateHostBuilder() 方法中使用此添加的 json 文件更新。一旦配置在 Startup.cs 中被激活,配置就会回到它的默认配置。我看到配置提供程序在输入 CreateHostBuilder() 之前是 5,然后在我添加我的 json 文件后它会跳到 6,但是当 Startup.ConfigureServices() 运行时,配置又回到了5。

我尝试了多种方法来为 webapi 创建配置,但都没有奏效。

解决方法
到目前为止,我的解决方法是在 VS 中使用应用程序机密,但由于某些设置(例如 Application Insights Telemetry Key)是共享的,因此在所有微服务之间进行复制是很痛苦的,因为我无法指向现有应用程序秘密。

有谁知道我做错了什么,或者如何正确地做到这一点?

.Net Core 的版本是 3.1.101 视觉工作室:16.4.5

【问题讨论】:

    标签: c# asp.net-core configuration


    【解决方案1】:

    我是否正确理解您想将一些配置(如密码或 API 密钥)存储在单独的文件夹中?因此,不将此类数据存储在 git-repository 中是非常合理的。

    第一个解决方案

    你知道AddInMemoryCollectionAddEFConfigurationAddCommandLineAddEnvironmentVariables吗?

    通过这种方法,您可以通过数据库、命令行参数或环境变量中的值来扩展您的设置文件。

    如果我是你,我会使用AddEnvironmentVariables

    在此处查看更多信息https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

    更多解决方案

    您可以将具有特定数据的文件添加到您的代码中,并在 GIT 中忽略它。因此,如果此文件是可选的,那么您的应用程序不会失败,但您可以更改配置。

    要做这样的事情:

    public IConfiguration Configuration { get; set; }
    public IHostingEnvironment Environment { get; set; }
    
    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    {
       Environment = environment;
       Configuration = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.secrets.json")
                .Build();
    }
    

    并将 appsettings.secrets.json 添加到你的 git ignore

    更多解决方案

    那么,为什么要使用SetBasePath? 为什么不使用带有完整路径的AddJsonFile?像这样:

    if(File.Exists(fullPath))
    {
        config.AddJsonFile(fileName, optional: true);
    }
    

    【讨论】:

    • 这可行,但它不像将设置文件发送给共同开发者并声明“将其放入您的文档文件夹”那么简单。我还使用“秘密文件”作为替代方案,并为每个项目配置了相同的秘密 ID,因此它们都指向同一个位置。我的问题只是基于共享的简单性。告诉开发人员将某些内容放入“我的文档”中比告诉他找到项目的机密位置并将文件存储在那里更容易,但这是一个公平的解决方法。我只在生产环境中使用环境变量。
    • 那么,您为什么不想使用第二种解决方案?您可以将文件添加到 .gitignore 文件并提交。然后,如果有人将此文件添加到 git 文件夹,它将不会提交。
    • 我再为你添加一个选项。
    • 我试过了,它似乎根本不起作用。这是最初的问题,它从 5 个配置元素开始,然后我调用 config.AddJsonFile() 它增加到 6,但是一旦它回到 Startup.ConfigureServices(),Json 文件又从配置中消失了。看起来 ConfigureHostBuilder 里面有些东西忽略/重置配置。
    • 您是否尝试以管理员身份运行它?它可能会因访问被拒绝错误而失败。
    【解决方案2】:
    1. 将自定义设置文件添加到您的项目中。例如 customAppsettings.json

    添加这样的设置

    {
    "yoursettingname": "yoursettingvalue"
    }
    
    1. 将以下代码添加到您的 startup.cs 构造函数中

        public IConfiguration Configuration { get; }
        public Startup()
           {
               Configuration = new ConfigurationBuilder()
               .AddJsonFile("appsettings.json")
               .AddJsonFile($"customAppsettings.json")
               .Build();
           }
      
    2. 你的 startup.cs 中的任何地方都可以这样访问它

      配置["yoursettingname"]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      相关资源
      最近更新 更多