簡體   English   中英

如何在環境變量中正確存儲連接字符串,以便通過生產ASP.Net Core MVC應用程序進行檢索

[英]How to correctly store connection strings in environment variables for retrieval by production ASP.Net Core MVC applications

我正在使用ASP.NET Core MVC應用程序,我的連接字符串存在問題。

我在生產服務器ASPNETCORE_ENVIRONMENT變量設置為Production ,而我的生產服務器是運行IIS的Windows Server 2012R2。 我還在生產服務器上安裝了DotNetCore.1.0.4_1.1.1-WindowsHosting.exe。

在開發過程中,我使用UserSecrets來保存我的連接字符串。 這工作正常。

對於生產,我希望我的生產服務器上的環境變量中的連接字符串,這是我遇到問題的地方。 我懷疑它可能是我構建環境變量的方式。

當我嘗試在生產中訪問數據庫時,我得到一個錯誤,表明它無法解析連接字符串。

An exception occurred in the database while iterating the results of a query.

System.ArgumentException: Keyword not supported: '"server'.
at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 
parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms)
at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)

如果我將連接字符串放在appSettings.json ,那么生產服務器就可以正常工作。

所以,這是我的appSettings.json文件的一個例子,顯示了在生產中工作的連接字符串;

{
  "ConnectionStrings": {
     "TestDb": "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
  },

    ...
    ...
    ...
  }
}

如果我將此appSettings.json文件部署到生產中,它可以正常工作。

在我的ASP.Net Core應用程序中,在Startup.cs文件中,我有以下內容:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets<Startup>();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();

}

我的理解是列出的最后一個builder.add ...具有優先級,所以在我的情況下,如果環境中存在連接字符串,它應優先於appsettings中的任何內容。

所以在生產中,如果我使用以下appSettings.config文件;

{
  "ConnectionStrings": {
     "TestDb": "Placeholder for connection string. Overridden by User Secrets in Development and Environment Variables in Production. "
  },

    ...
    ...
    ...
  }
}

如果我有一個連接字符串的環境變量,那么我在appsettings.json文件中作為ConnectionStrings:TestDb的值應該沒關系。

下面列出的是我正在使用的環境變量;

Variable                    Value
ConnectionStrings:TestDb    "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"

但是,當我使用此設置時,當我嘗試訪問數據庫時指示它無法解析連接字符串時出現錯誤。

我必須假設問題是我在環境變量中指定連接字符串的方式,但經過一段時間在線搜索后,我無法找到環境變量值應該是什么樣子的示例。 例如,我是否需要在整個字符串周圍放置前導和尾隨單引號? 連接字符串的各個部分是否需要單引號或雙引號?

任何幫助,例如在環境變量中定義的正確連接字符串的示例,都將非常感激。

您的連接變量中設置了錯字/錯誤值。

在您粘貼的輸出中可以看到:

Variable                    Value
ConnectionStrings:TestDb    "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"

這可能在設置變量via時發生

$env:ConnectionStrings:MyDb = """Server=..."""

正確的方法是設置它沒有引號。

$env:ConnectionStrings:MyDb = "Server=..."

舊答案(對於可能搜索類似問題的其他用戶)

連接字符串的約定是Azure Web Apps使用的SQLCONNSTR_MYSQLCONNSTR_SQLAZURECONNSTR_CUSTOMCONNSTR_ ,但也適用於自托管,VM或任何其他雲提供程序。

因此,如果您有一個名為CUSTOMCONNSTR_TestDb的環境變量,它將與在appsettings.json中定義它一樣。

{
    "connectionStrings": {
        "TestDb": "..."
    }
}

如果在.UseJsonFile(...)之后調用AddEnvironmentVariables() ,它還將覆蓋其中的值。 上次注冊獲勝。

var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    // This one needs to be last
    .AddEnvironmentVariables();

您還可以使用其他變量來覆蓋配置值。 IIRC。 ASPNETCORE_是默認前綴(但您可以在AddEnvironmentVariables("MY_")更改它)。

因此, ASPNETCORE_MySettings會覆蓋Configuration["MySettings"] (或Configuration.Get("MySettings") )和ASPNETCORE_My__Settings (在Linux上使用雙下划線用於級別層次結構,讀取位置:用於獲取配置 - Linux禁止變量名中的冒號)覆蓋Configuration["My:Settings"]如此相同

{
    "my": {
        "settings": "..."
    }
}

除非他們最近改變了。

FWIW:據我記憶,環境變量/配置鍵名稱不區分大小寫。

在您的配置中,您有以下這一行:

.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

這告訴您的配置系統可能存在一個JSON文件,其中包含特定於環境的設置。 因此,您只需要一個名為appSettings.Production.config的生產框上存在的文件,其中包含以下內容:

{
  "ConnectionStrings": {
     "TestDb": "Server=...;Catalog=...;Etc=..."
  }
}

此處的值將覆蓋基本JSON設置文件中指定的任何內容。

如果您不想存儲在appsettings中,請將其存儲在文件C:\\ Windows \\ System32 \\ inetsrv \\ config \\ applicationHost.config中。 它將能夠工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM