首頁 > 軟體

為什麼ASP.NET Core 資料庫連線串的值和appsettings.json配的不一樣?

2022-02-20 10:00:38

一、設定讀取順序

ASP.NET Core 中的設定是使用一個或多個設定提供程式執行的,設定提供程式使用各種設定源從鍵值對讀取設定資料。

ASP.NET Core 提供了大量可用的設定提供程式,這還不包括可以自定義設定提供程式。

新增設定提供程式的順序很重要,因為後面的提供程式新增的設定值將覆蓋前面的提供程式新增的值。

設定提供程式的典型順序為:

  • appsettings.json
  • appsettings.Environment.json
  • 使用者機密
  • 環境變數
  • 命令列引數

假如,appsettings.json設定了開發環境的資料庫連線串,appsettings.Production.json設定了生產環境的資料庫連線串;管理員密碼僅設定在使用者機密中。

最終生產環境的設定為:

來源
資料庫連線串appsettings.Production.json
管理員密碼使用者機密

二、分析

IConfigurationRoot 介面的檔案上,可以瞭解到,IConfigurationRoot是表示 IConfiguration 層次結構的根。

使用IConfigurationRoot.Providers可以得到IEnumerable,猜測應該是順序排列的。

然後反向遍歷Providers,讀取設定key對應的值,如果存在那應該就是設定的來源了。

讓我們驗證一下。

三、演示

1.讀取Providers

建立WebApplication1,修改Startup.cs,程式碼如下:

public Startup(IConfiguration configuration)
{
    Configuration = (IConfigurationRoot)configuration;
}

public IConfigurationRoot Configuration { get; }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ......

    app.UseEndpoints(endpoints =>
    {
            endpoints.MapGet("/test", async context =>
            {
                foreach(var provider in Configuration.Providers)
                {
                    await context.Response.WriteAsync(provider.ToString());
                    await context.Response.WriteAsync("rn");
                }
            });
    });
    
    ......
}

從下圖看到,順序應該是正確的:

2.讀取設定值

繼續修改Startup.cs,程式碼如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ......

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/test2/{key:alpha}", async context =>
        {
            var key = context.Request.RouteValues["key"].ToString();
            foreach (var provider in Configuration.Providers.Reverse())
            {
                if (provider.TryGet(key, out string value))
                {
                    await context.Response.WriteAsync(provider.ToString());
                    await context.Response.WriteAsync("rn");
                    await context.Response.WriteAsync(value);
                    break;
                }
            }
        });
    });
    
    ......
}

執行後查詢AllowedHosts設定,返回結果正確。

再次查詢AllowedHosts設定,返回結果正確。

到此這篇關於為什麼資料庫連線串的值和appsettings.json配的不一樣?的文章就介紹到這了,更多相關資料庫連線串的值和appsettings.json設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com