Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将自定义设置文件添加到Asp.Net Core 3.1 WebApi_C#_Asp.net Core_Configuration - Fatal编程技术网

C# 无法将自定义设置文件添加到Asp.Net Core 3.1 WebApi

C# 无法将自定义设置文件添加到Asp.Net Core 3.1 WebApi,c#,asp.net-core,configuration,C#,Asp.net Core,Configuration,我正在写一个WebApi来跟踪我的小狗的行为(如厕休息、板条箱训练等)。api有一个用Blazor编写的前端组件,但这不是问题的一部分 在我的github项目中,我从不使用文件appsettings.json,因为我担心会意外提交它,从而泄露任何秘密。相反,我想添加自己的appsettings文件,如下所示: 公共静态IHostBuilder CreateHostBuilder(字符串[]args)=> Host.CreateDefaultBuilder(args) .ConfigureAppC

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

在我的github项目中,我从不使用文件appsettings.json,因为我担心会意外提交它,从而泄露任何秘密。相反,我想添加自己的appsettings文件,如下所示:

公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(配置=>{
var basePath=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var fileName=“puppytrackersettings.json”;
var fullPath=Path.Combine(basePath,文件名);
if(File.Exists(完整路径))
{
config.SetBasePath(basePath);
config.AddJsonFile(文件名,可选:true);
}
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
这样,设置文件可以保存在“我的文档”文件夹(“/”在linux上),安全地远离源代码

问题
问题是,在CreateHostBuilder()方法中,配置仅使用此添加的json文件更新。在Startup.cs中激活配置后,配置将恢复为默认配置。在输入CreateHostBuilder()之前,我看到configurationproviders是5,然后在添加json文件后,它会跳到6,但是当Startup.ConfigureServices()运行时,配置会再次返回到5

我尝试了许多方法来创建webapi的配置,但都没有成功

解决方法
到目前为止,我的解决方法是在VS中使用应用程序机密,但由于一些设置(如application Insights Telemetry Key)是共享的,因此在所有微服务中复制是一件痛苦的事情,因为我无法指向现有的应用程序机密

有人知道我做错了什么,或者如何正确地做这件事吗

.NETCore的版本是3.1.101
Visual Studio:16.4.5

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

第一个解决方案

您是否知道
AddInMemoryCollection
AddEFConfiguration
AddCommandLine
AddEnvironmentVariables

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

如果我是你,我将使用
AddEnvironmentVariables

请参阅此处的更多信息

还有一个解决方案

您可以将包含特定数据的文件添加到代码中,并在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);
}
  • 将自定义设置文件添加到项目中。例如customAppsettings.json
  • 添加如下设置

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

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

    {
    "yoursettingname": "yoursettingvalue"
    }
    
    配置[“yoursettingname”]


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