EiE*_*Guy 21 c# environment-variables asp.net-core-mvc asp.net-core
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
如果我将连接字符串放入appSettings.json,生产服务器就可以正常工作.
所以,这是我的appSettings.json文件示例,显示了在生产中工作的连接字符串;
{
"ConnectionStrings": {
"TestDb": "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
},
...
...
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将此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();
}
Run Code Online (Sandbox Code Playgroud)
我的理解是列出的最后一个builder.add ...具有优先级,所以在我的情况下,如果环境中存在连接字符串,它应优先于appsettings中的任何内容.
所以在生产中,如果我使用以下appSettings.config文件;
{
"ConnectionStrings": {
"TestDb": "Placeholder for connection string. Overridden by User Secrets in Development and Environment Variables in Production. "
},
...
...
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个连接字符串的环境变量,那么我ConnectionStrings:TestDb在该appsettings.json文件中的值是什么并不重要.
下面列出的是我正在使用的环境变量;
Variable Value
ConnectionStrings:TestDb "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
Run Code Online (Sandbox Code Playgroud)
但是,当我使用此设置时,当我尝试访问数据库时指示它无法解析连接字符串时出现错误.
我必须假设问题是我在环境变量中指定连接字符串的方式,但经过一段时间在线搜索后,我无法找到环境变量值应该是什么样子的示例.例如,我是否需要在整个字符串周围放置前导和尾随单引号?连接字符串的各个部分是否需要单引号或双引号?
任何帮助,例如在环境变量中定义的正确连接字符串的示例,都将非常感激.
Tse*_*eng 19
您的连接变量中设置了错字/错误值.
在您粘贴的输出中可以看到:
Variable Value
ConnectionStrings:TestDb "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
Run Code Online (Sandbox Code Playgroud)
这可能在设置变量via时发生
$env:ConnectionStrings:MyDb = """Server=..."""
Run Code Online (Sandbox Code Playgroud)
正确的方法是设置它没有引号.
$env:ConnectionStrings:MyDb = "Server=..."
Run Code Online (Sandbox Code Playgroud)
用于连接字符串的惯例是SQLCONNSTR_,MYSQLCONNSTR_,SQLAZURECONNSTR_而CUSTOMCONNSTR_这是通过Azure的Web应用程序使用,也应适用于自托管,虚拟机或任何其他云服务提供商.
因此,如果您有一个名为的环境变量CUSTOMCONNSTR_TestDb,它将与在appsettings.json中定义它一样
{
"connectionStrings": {
"TestDb": "..."
}
}
Run Code Online (Sandbox Code Playgroud)
如果AddEnvironmentVariables()调用后,它还将覆盖其中的值.UseJsonFile(...).上次注册获胜.
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();
Run Code Online (Sandbox Code Playgroud)
您还可以使用其他变量来覆盖配置值.IIRC.ASPNETCORE_是默认前缀(但您可以在其中更改AddEnvironmentVariables("MY_")).
因此,ASPNETCORE_MySettings覆盖Configuration["MySettings"](或Configuration.Get("MySettings"))和ASPNETCORE_My__Settings(在Linux上使用级别层次结构的双下划线,读取:用于获取配置的位置 - Linux禁止变量名中的冒号)覆盖Configuration["My:Settings"]如此相同
{
"my": {
"settings": "..."
}
}
Run Code Online (Sandbox Code Playgroud)
除非他们最近改变了.
FWIW:据我记忆,环境变量/配置键名称不区分大小写.
| 归档时间: |
|
| 查看次数: |
21166 次 |
| 最近记录: |