【问题标题】:.NET Core 2.2 Razor Pages Conditional Connections String based on Dev or Prod Enviroment.NET Core 2.2 Razor Pages 条件连接字符串基于 Dev 或 Prod 环境
【发布时间】:2019-10-03 05:22:38
【问题描述】:

多年来我一直在 .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" />

但我还没有为我的 C# Razor Pages 搜索和找到如此简单的东西。 Microsoft howto 中的任何内容都让我大吃一惊。

这是我的 Razor Pages 项目中的 appSetting.json:

  "ConnectionStrings": {

    "DefaultConnection": "Data Source=Txx\\SQLxxx;Initial Catalog=xxx;Persist Security Info=True",
    "Production": "Data Source=xxx;Initial Catalog=xxx;Integrated Security=True;User ID=xxx;Password=xxx"
  },

这里是我引用连接字符串的地方——它是硬编码的——但我希望有一种方法可以执行“如果”语句:“如果环境 = 随便什么,则获取此连接字符串”。

services.AddDbContext<MyDbContext>(
         options => { options.UseSqlServer(@"Data Source=Txxx;Initial Catalog=xxx;Integrated Security=True"); });

【问题讨论】:

    标签: .net-core connection-string razor-pages


    【解决方案1】:

    只需检查configuration documentation,我想您使用的是 Asp Net Core,并且您正在启动中添加 Mvc

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
        app.UseMvc();
        ...
    }
    

    默认会尝试加载2个配置文件appsettings.jsonappsettings.{Environment}.json,最新的会覆盖最终配置的内容,而且默认情况下,核心已经有两个环境,development和@987654332 @,一切都取决于您使用的配置文件(在 Visual Studio 中,默认情况下将是开发)。

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

    您还可以加载更多文件或使用类似的方式更改默认文件

    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>();
    

    如果你想要环境变量

    Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT ")
    

    但请考虑更安全

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

    可以在secrets documentation 中找到这个和其他使用秘密管理器的解决方案。

    编辑

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

    不,它不会加载一个或另一个,首先它会加载 appsettings.json,无论你有什么环境,它总是这样。

    然后,在它加载appsettings.json 之后,它会尝试加载appsettings.{Environment}.json,它会添加以前不存在的密钥,如果存在,它会覆盖旧密钥。

    如果你在 appSettings 中有

    {
      "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_ENVIRONMENT”的内容?

    environmental variable,在操作系统中设置。此外,对于开发,Visual Studio 可以在您开发应用程序时预加载一些变量,只需检查您的 launchSettings.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"
    },
    

    最好能找到服务器名称并使用它。 因为我只会检查我的开发箱服务器名称,其他一切 意味着生产

    现在更简单了,如果变量不存在,它只会加载可能包含您的产品设置的 appsettings。开发时,Visual Studio(或 VS Code,或 Rider)已经在添加值为 Development 的变量,因此您只需添加文件 appsettings.Development.json

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

    【讨论】:

    • 好的,环境检查回答了我的问题。但是 appSettings.Development.json 听起来很棒。换句话说,如果在 Dev 环境中,“.Development”。使用 json 文件。否则,它默认为“appSettings.json”文件(这将在生产中)。此外,什么决定了“ASPNETCORE_ENVIRONMENT”的内容?当我发布和上传?找到服务器名称并使用它会很好。因为我只会检查我的开发框服务器名称,所以其他一切都意味着生产。
    • 编辑了我的答案
    • 我已经有了这些 appSettings.json 文件。它们随我开始的 .NET Core 2.2 Razor Pages 一起提供。我仍然很困惑。信息很多,没有简单的使用。也许我脑子有问题。
    • 好的,即使我在 appsettings.json 中将“DefaultConnection”设置为生产数据库,它也会从 appsetting.Development.json 获得正确的“DefaultConnection”。这是所希望的。现在,当我发布我的 Web 应用程序时,我不会包含 appsettings.Development.json。除了:我不能使用 ---var connection = Configuration["ConnectionStrings:DefaultConnection"]; --- 在我的 --public class MyDbContext : DbContext -- OnConfiguring 部分。 stackoverflow.com/questions/56178017/…
    • 我得到了处理我发布的这个问题的动态连接字符串:stackoverflow.com/questions/56178017/… 我接受你的回答,因为你对 appSettings.json 的解释以及 appSettings.Development.json 如何覆盖任何相似的名称使它变得非常容易发布到生产。上传到生产服务器时,我只是不包含 appSettings.Develpment.json。
    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多