Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在环境变量ASP.Net MVC应用程序中正确存储数据库连接字符串_C#_Asp.net_Asp.net Mvc_Environment Variables - Fatal编程技术网

C# 在环境变量ASP.Net MVC应用程序中正确存储数据库连接字符串

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

出于安全原因,我正在尝试将2个数据库连接字符串移动到环境变量。当我在web.config上包含2个连接字符串时,一切正常,如下所示:

<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.my
RDSContext::DbContext
类,它包含访问数据库表的所有数据库集。如果我实现您建议的上述代码,这个类是否保持不变?e、 g.当前当我想访问数据库时,我只需要使用
private RDSContext db=new RDSContext()然后使用
db.table…
。它是如何影响的?@craig19对于EF DbContext类,有一个连接连接字符串的构造函数重载,对吗?因此,您的构造函数变成了公共RDSContext(MyApplicationDatabaseConfiguration dbConfig):base(dbConfig.ConnectionString)