.net core 基于开发或产品环境的.NET Core 2.2 Razor Pages条件连接字符串

.net core 基于开发或产品环境的.NET Core 2.2 Razor Pages条件连接字符串,.net-core,connection-string,razor-pages,.net Core,Connection String,Razor Pages,多年来,我一直在.NET Web表单中执行此操作: Dim conn As New SqlConnection(f1.fUseThisConnection(Server.MachineName)) Public Function fUseThisConnection(ByVal strThisMachine As String) As String If strThisMachine = "T61" Then fUseThisConnection = Config

多年来,我一直在.NET Web表单中执行此操作:

  Dim conn As New SqlConnection(f1.fUseThisConnection(Server.MachineName))

Public Function fUseThisConnection(ByVal strThisMachine As String) As String

    If strThisMachine = "T61" Then
        fUseThisConnection = ConfigurationManager.AppSettings("DevHome")
    Else
        fUseThisConnection = ConfigurationManager.AppSettings("Production")
    End If

End Function
AppSettings位于Web.config中:

<appSettings>
    <add key="Production" value="server=xxx;uid=xxx;pwd=xxx;database=xxx;pooling=false" />
    <add key="DevHome" value="server=xxx;uid=xxx;pwd=xxx;database=xxx;pooling=false" />
这里是我引用连接字符串的地方——它是硬编码的——但我希望有一种方法可以执行“If”语句:“If environment=whatever,然后获取这个连接字符串”

services.AddDbContext(
选项=>{options.UseSqlServer(@“数据源=Txxx;初始目录=xxx;集成安全性=True”);});
只要检查一下,我想您使用的是Asp Net Core,并且您正在启动中添加Mvc

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseMvc();
    ...
}
默认情况下,它将尝试加载2个配置文件,
appsettings.json
appsettings.{Environment}.json
,最新的配置将覆盖最终配置的内容,而且默认情况下,core已经有两个环境,
开发
生产
,所有这些都取决于您使用的配置文件(在VisualStudio中,默认情况下将是development)

因此,可以将配置文件重命名为
appsettings.json
,然后为生产声明连接字符串,并创建一个文件
appsettings.Development.json
,您可以使用开发连接字符串覆盖连接

services.AddDbContext<MyDbContext>(
         options => { options.UseSqlServer(@"Data Source=Txxx;Initial Catalog=xxx;Integrated Security=True"); });
您还可以加载更多文件来更改默认文件,方法如下

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddInMemoryCollection(arrayDict);
            config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
            config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
            config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
            config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
            config.AddCommandLine(args);
        })
        .UseStartup<Startup>();

<强>但请考虑更安全< <强>

对于敏感数据,更安全的方法是将连接字符串配置为服务器中的环境变量,这样可以将其从代码中删除并保持更私密

可以在中找到使用机密管理器的此解决方案和其他解决方案

编辑 否则,它默认为“appSettings.json”文件(这将是 生产中)

不,它不会加载一个或另一个,首先它会加载appsettings.json,无论您使用的是什么环境,都是这样

然后,在加载
appsettings.json
之后,它将尝试加载
appsettings.{Environment}.json
,并添加以前不存在的键,如果存在,它将覆盖旧键

如果应用程序设置中有

{
  "SomeConfigJustInAppSettings": "some value",
  "ThisWillBeOverride": "some value"
}
以及您的appsettings.Development.json

{
  "SomeConfigJustInDev": "some other value",
  "ThisWillBeOverride": "some other value"
}
您在dev中的配置最终将是:

{
  "SomeConfigJustInAppSettings": "some value",
  "SomeConfigJustInDev": "some other value",
  "ThisWillBeOverride": "some other value"
}
什么决定了“ASPNETCORE_环境”的价值

是一个,在操作系统中设置。另外,对于开发,Visual studio有能力在您开发应用程序时预加载一些变量,只需检查您的
启动设置.json
,例如:

{
  "profiles": {
    "MyProject": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:50051"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}"
    }
  }
}
特别是这一部分

"environmentVariables": {
  "ASPNETCORE_ENVIRONMENT": "Development"
},
只要找到服务器名称并使用它就好了。 因为我只会检查我的开发框servername,以及其他所有内容 这意味着生产

现在更简单的是,如果变量不存在,它只加载可能包含prod设置的appsettings。当您在开发时,visual studio(或VS code或Rider)已经在添加值为
Development
的变量,因此您只需添加文件
appsettings.Development.json

你甚至可以创建一个新的项目,默认的项目布局已经为你创建了这两个文件

只要检查一下,我想您正在使用Asp Net Core,并且您正在启动中添加Mvc

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseMvc();
    ...
}
默认情况下,它将尝试加载2个配置文件,
appsettings.json
appsettings.{Environment}.json
,最新的配置将覆盖最终配置的内容,而且默认情况下,core已经有两个环境,
开发
生产
,所有这些都取决于您使用的配置文件(在VisualStudio中,默认情况下将是development)

因此,可以将配置文件重命名为
appsettings.json
,然后为生产声明连接字符串,并创建一个文件
appsettings.Development.json
,您可以使用开发连接字符串覆盖连接

services.AddDbContext<MyDbContext>(
         options => { options.UseSqlServer(@"Data Source=Txxx;Initial Catalog=xxx;Integrated Security=True"); });
您还可以加载更多文件来更改默认文件,方法如下

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddInMemoryCollection(arrayDict);
            config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
            config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
            config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
            config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
            config.AddCommandLine(args);
        })
        .UseStartup<Startup>();

<强>但请考虑更安全< <强>

对于敏感数据,更安全的方法是将连接字符串配置为服务器中的环境变量,这样可以将其从代码中删除并保持更私密

可以在中找到使用机密管理器的此解决方案和其他解决方案

编辑 否则,它默认为“appSettings.json”文件(这将是 生产中)

不,它不会加载一个或另一个,首先它会加载appsettings.json,无论您使用的是什么环境,都是这样

然后,在加载
appsettings.json
之后,它将尝试加载
appsettings.{Environment}.json
,并添加以前不存在的键,如果存在,它将覆盖旧键

如果应用程序设置中有

{
  "SomeConfigJustInAppSettings": "some value",
  "ThisWillBeOverride": "some value"
}
以及您的appsettings.Development.json

{
  "SomeConfigJustInDev": "some other value",
  "ThisWillBeOverride": "some other value"
}
您在dev中的配置最终将是:

{
  "SomeConfigJustInAppSettings": "some value",
  "SomeConfigJustInDev": "some other value",
  "ThisWillBeOverride": "some other value"
}
什么决定了“ASPNETCORE_环境”的价值

是一个,在操作系统中设置。另外,对于开发,Visual studio有能力在您开发应用程序时预加载一些变量,只需检查您的
启动设置.json
,例如:

{
  "profiles": {
    "MyProject": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:50051"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}"
    }
  }
}
特别是这一部分

"environmentVariables": {
  "ASPNETCORE_ENVIRONMENT": "Development"
},
只要找到服务器名称并使用它就好了。 因为我只会检查我的开发框servername,以及其他所有内容 这意味着生产

现在更简单的是,如果变量不存在,它只加载可能包含prod设置的appsettings。当您在开发时,visual studio(或VS code或Rider)已经在添加值为
Development
的变量,因此您只需添加文件
appsettings.Development.json

你甚至可以创建一个新的项目,默认的pr