.NET Core 2.2 Razor Pages Строка условных соединений, основанная на среде Dev или Prod - PullRequest
0 голосов
/ 16 мая 2019

Я делал это в .NET Web Forms в течение многих лет:

  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 просто поражает меня.

Вот мой appSetting.json в моем проекте Razor Pages:

  "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"); });

1 Ответ

2 голосов
/ 16 мая 2019

Просто посмотрите документацию по конфигурации . Я полагаю, вы используете Asp Net Core и добавляете Mvc в свой стартап

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

По умолчанию, он попытается загрузить 2 файла конфигурации, appsettings.json и appsettings.{Environment}.json, последние переопределяют содержимое из окончательной конфигурации, а также по умолчанию ядро ​​уже имеет две среды: development и * 1009. *, все зависит от того, какой профиль вы используете (в 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 ")

Но, пожалуйста, подумайте о том, чтобы быть более безопасным

Для важных данных более безопасным может быть настройка строки подключения в качестве переменной среды на вашем сервере, чтобы ее можно было удалить из кода и сохранить большую конфиденциальность.

Это и другое решение, использующее менеджер секретов, можно найти в документации секреты .

Редактировать

В противном случае по умолчанию используется файл 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_ENVIRONMENT"?

Является переменной среды , установленной в Оперативной системе. Кроме того, для разработки 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"
},

Было бы неплохо просто найти имя сервера и использовать его. Потому что я бы проверил только мое имя сервера, а все остальное будет означать производство

Прямо сейчас это еще проще, если переменная не существует, она просто загружает настройки приложения, которые могут содержать ваши настройки продукта. Когда вы разрабатываете, Visual Studio (или код VS, или Rider) уже добавляет переменную со значением Development, поэтому все, что вам нужно сделать, это добавить файл appsettings.Development.json.

Черт, вы даже можете просто создать новый проект, макет проекта по умолчанию уже создает эти два файла для вас!

Default project created with Visual Studio

...