【发布时间】:2017-12-09 10:33:54
【问题描述】:
我正在开发一个 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"
但是,当我使用此设置时,我在尝试访问数据库时收到错误消息,指出它无法解析连接字符串。
我不得不假设问题是我在环境变量中指定连接字符串的方式,但是在网上搜索了一段时间后,我一直无法找到环境变量值应该是什么样子的示例喜欢。例如,我是否需要在整个字符串前后加上单引号?连接字符串的各个部分需要单引号还是双引号?
任何帮助,例如在环境变量中定义的正确连接字符串的示例,将不胜感激。
【问题讨论】:
-
你没有一个
appSettings.Production.config文件用于 prod 中的设置吗? -
对不起,现在我看到了。您的连接字符串中有引号,错误消息也告诉它。
'"server',乞讨时有"。当您在某处设置它时,您可能添加了"。即$env:ConnectionStrings:MyDb = """Server=;""",但正确的是$env:ConnectionStrings:MyDb = "Server=;",这也由您的环境变量输出确认 -
我正在将连接字符串直接复制并粘贴到 Windows“新系统变量”对话框中,该对话框是系统属性控制面板的一部分(即控制面板 --> 所有控制面板项 --> 系统-->Advanced System Settings -->Environment Variables-->System Variables-->New... --> 然后我将变量名设置为 ASPNETCORE_TestDB 并将变量值设置为 "TestDb": "Server=TestServer;Database= TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true" 包括前导/尾随引号。这仍然会出现错误。
-
我尝试了完全相同的方法,但没有任何前导和尾随引号,我仍然收到错误
标签: c# asp.net-core environment-variables asp.net-core-mvc