C# 在环境变量ASP.Net MVC应用程序中正确存储数据库连接字符串
出于安全原因,我正在尝试将2个数据库连接字符串移动到环境变量。当我在web.config上包含2个连接字符串时,一切正常,如下所示:C# 在环境变量ASP.Net MVC应用程序中正确存储数据库连接字符串,c#,asp.net,asp.net-mvc,environment-variables,C#,Asp.net,Asp.net Mvc,Environment Variables,出于安全原因,我正在尝试将2个数据库连接字符串移动到环境变量。当我在web.config上包含2个连接字符串时,一切正常,如下所示: <connectionStrings> <clear /> <add name="DefaultConnection" connectionString="Data Source=xxxxxx" providerName="System.Data.SqlClient" /> <add name="R
<connectionStrings>
<clear />
<add name="DefaultConnection" connectionString="Data Source=xxxxxx" providerName="System.Data.SqlClient" />
<add name="RDSContext" connectionString="Data Source=xxxxxx" providerName="System.Data.SqlClient" />
</connectionStrings>
然后,我从web.config中删除了2个连接字符串,并创建了2个环境变量,如下所示:
setx CUSTOMCONNSTR\u DefaultConnection“数据源=xxxxx”
setx CUSTOMCONNSTR\u RDSContext“数据源=xxxxx”
虽然我现在在启动IIS并访问web应用程序时出现以下错误
“/”应用程序中出现服务器错误。
无法将文件“C:\Users\xxx\xxx\App\u Data\BookingSystem.Models.RDSContext.mdf”附加为数据库“BookingSystem.Models.RDSContext”。
有人能告诉我我做错了什么吗?简单地以某种方式命名环境变量并不意味着MVC会接受它们。你可能会认为发生的事情比实际发生的要多一些 执行
ConfigurationManager.ConnectionString[“MyConnectionStringName”].ConnectionString
时,您仅从web.config文件或machine.config(如果您碰巧在其中定义了)检索连接字符串。没有任何东西可以告诉你的应用程序从其他任何地方抓取它
相反,您可以考虑创建一个类来表示您的配置:
public class MyApplicationDatabaseConfiguration
{
public string ConnectionString { get; set; }
}
需要获取此连接字符串的任何类都可以通过依赖MyApplicationDatabaseConfiguration的实例来实现
public class MyDatabaseRepository
{
readonly MyApplicationDatabaseConfiguration _dbConfig;
public MyDatabaseRepository(MyApplicationDatabaseConfiguration dbConfig)
{
_dbConfig = dbConfig;
}
public void DoSomethingWithTheDatabase()
{
using(var connection = new SqlConnection(_dbConfig.Connectionstring))
{
//now you can use the connection
}
}
}
然后你可以随意加载你的配置。例:
MyApplicationDatabaseConfiguration dbConfig = new MyApplicationDatabaseConfiguration();
dbConfig.ConnectionString = Environment.GetEnvironmentVariable("MyApplication_MyConnectionString");
现在MyDatabaseRepository不关心如何加载数据库配置,它只是说“我需要数据库配置”。这是非常强大的,它允许您通过简单地更改一行代码来更改配置。需要更改回使用web.config吗?它非常简单,如dbConfig.ConnectionString=ConfigurationManager.ConnectionString[“MyConnectionStringName”].ConnectionString;
Microsoft在Microsoft.Extensions.Configuration library中更进一步,该库用于.NET Core,但面向.NET标准,因此。web服务器是否与您使用
setx
时以相同的用户身份运行?您不能使用IIS管理控制台,为特定的web应用程序设置环境变量?您设置了环境变量,但您是否确实对代码做了任何操作,让它从环境变量而不是web.config文件中读取连接字符串?@mason感谢您的回复。通过阅读另一个堆栈溢出线程,我认为MVC应用程序会自动识别连接字符串,因为我将它们称为CUSTOMCONNSTR\ux…
,这是错误的吗?我在哪里可以告诉应用程序从环境变量读取连接字符串?因为我不能使用Environment.GetEnvironmentVariable(“CUSTOMCONNSTR_RDSContext”)。一个问题,这将如何影响我的DbContext类?e、 g.myRDSContext::DbContext
类,它包含访问数据库表的所有数据库集。如果我实现您建议的上述代码,这个类是否保持不变?e、 g.当前当我想访问数据库时,我只需要使用private RDSContext db=new RDSContext()代码>然后使用db.table…
。它是如何影响的?@craig19对于EF DbContext类,有一个连接连接字符串的构造函数重载,对吗?因此,您的构造函数变成了公共RDSContext(MyApplicationDatabaseConfiguration dbConfig):base(dbConfig.ConnectionString)代码>