Parametryzowanie ustawień uruchomieniowych wersji deweloperskiej i produkcyjnej

0

Dzień dobry,
utworzyłem sobie dwa pliki konfiguracyjne:
screenshot-20231025013800.png

Następnie w pliku launchSettings.json dodałem takie pozycje:

"Development": {
  "commandName": "Project",
  "launchBrowser": true,
  "dotnetRunMessages": true,
  "applicationUrl": "http://localhost:5001",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
},
"Production": {
  "commandName": "Project",
  "launchBrowser": true,
  "dotnetRunMessages": true,
  "applicationUrl": "http://192.168.1.4:5001",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Production"
  }

Oto zawartość plików konfiguracyjnych:
a) appssettings.json:

{
  "BackendSettings": {
    "Host": "old",
    "Port": "80",
    "Protocol": "http"
  },

b) appssettings.Development.json:

{
  "BackendSettings": {
    "Host": "localhost",
    "Port": "5001",
    "Protocol": "http"
  },

c) appssettings.Production.json:

{
  "BackendSettings": {
    "Host": "backend",
    "Port": "80",
    "Protocol": "http"
  },

Teraz uruchamiam apke przy pomocy polecenia

dotnet run --launch-profile Development

lub

dotnet run --environment Development 

i niestety w obydwóch przypadkach otrzymuje wartość hosta "old" co wskazuje na to że wczytywana została wartość z pliku appssettings.json, czyli w tej sytuacji nie reaguje na zmienne Development.

Jak mogę rozwiązać ten problem?

Pozdrawiam,
Łukasz

2

Spróbuj ustawić wcześnie jako zmienna środowikowa:

set ASPNETCORE_ENVIRONMENT=Staging
dotnet run --no-launch-profile

1

W VisualStudio np. można ustawić to w:

PPM na projekcie > Properties > Debug > Environment Variables
0
jarzi napisał(a):

W VisualStudio np. można ustawić to w:

PPM na projekcie > Properties > Debug > Environment Variables

Mam to utworzone, ale nie wiem dlaczego nadal to nie działa :(
screenshot-20231025092355.png

0

A usuń jeszcze obj/ i bin/ i zbuduj jeszcze raz.

0
S4t napisał(a):

A usuń jeszcze obj i bin i zbuduj jeszcze raz

Usunąłem teraz obj i bin i uruchomiłem apke z polecenia dotnet run --environment Development i niestety nadal bierze ustawienia z pliku appssettings.json :(

0

A możesz pokazać logi jak aplikacja startuje?

0
virusek391 napisał(a):
S4t napisał(a):

A usuń jeszcze obj i bin i zbuduj jeszcze raz

Usunąłem teraz obj i bin i uruchomiłem apke z polecenia dotnet run --environment Development i niestety nadal bierze ustawienia z pliku appssettings.json :(

Teraz patrze że faktycznie profil wczytuje Development, ale zastanawiam się dlaczego nie wczytuje appssetings.Development.json

screenshot-20231025093844.png

1
virusek391 napisał(a):
virusek391 napisał(a):
S4t napisał(a):

A usuń jeszcze obj i bin i zbuduj jeszcze raz

Usunąłem teraz obj i bin i uruchomiłem apke z polecenia dotnet run --environment Development i niestety nadal bierze ustawienia z pliku appssettings.json :(

Teraz patrze że faktycznie profil wczytuje Development, ale zastanawiam się dlaczego nie wczytuje appssetings.Development.json

screenshot-20231025093844.png

a jak to masz kodzie : https://www.tektutorialshub.com/asp-net-core/aspnetcore_environment-variable-in-asp-net-core/ ?

 config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

0

A jak wygląda Program.cs?

0
jarzi napisał(a):

A jak wygląda Program.cs?

using Blazored.SessionStorage;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web;

using MudBlazor.Services;
using Rejestr_Wylegów_NET;
using Rejestr_Wylegów_NET.Models;
using Rejestr_Wylegów_NET.Services;
using System.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Hosting.StaticWebAssets;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Localization;
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddMudServices();
builder.Services.AddHttpClient();
builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets();

builder.Services.AddSingleton<DatabaseService>();
builder.Services.AddBlazoredSessionStorage();

//builder.Services.AddSingleton<CounterService>(); 
//builder.Services.AddHostedService(sp => sp.GetRequiredService<CounterService>());
builder.Services.AddSingleton<UserInfo>();
builder.Services.AddScoped<AuthenticationStateProvider, SimpleAuthenticationStateProvider>();

builder.Services.AddServerSideBlazor();

builder.Services.AddAuthentication();

builder.Services.AddMudServices(config =>
{
    config.SnackbarConfiguration.PreventDuplicates = false;
    config.SnackbarConfiguration.NewestOnTop = false;
    config.SnackbarConfiguration.ShowCloseIcon = true;

    config.SnackbarConfiguration.VisibleStateDuration = 20000;
    config.SnackbarConfiguration.HideTransitionDuration = 500;
    config.SnackbarConfiguration.ShowTransitionDuration = 500;
;
});

var app = builder.Build();

var culture = new CultureInfo("en-US");
culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
var supportedCultures = new List<CultureInfo> { culture };
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture(culture, culture),
    // Formatting numbers, dates, etc.
    SupportedCultures = supportedCultures,
    // UI strings that we have localized.
    SupportedUICultures = supportedCultures
});

app.UseStaticFiles();
app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();
0
S4t napisał(a):
virusek391 napisał(a):
virusek391 napisał(a):
S4t napisał(a):

A usuń jeszcze obj i bin i zbuduj jeszcze raz

Usunąłem teraz obj i bin i uruchomiłem apke z polecenia dotnet run --environment Development i niestety nadal bierze ustawienia z pliku appssettings.json :(

Teraz patrze że faktycznie profil wczytuje Development, ale zastanawiam się dlaczego nie wczytuje appssetings.Development.json

screenshot-20231025093844.png

a jak to masz kodzie : https://www.tektutorialshub.com/asp-net-core/aspnetcore_environment-variable-in-asp-net-core/ ?

 config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

Mój kod Program.cs wygląda tak:

using MudBlazor.Services;
using Rejestr_Wylegów_NET;
using Rejestr_Wylegów_NET.Models;
using Rejestr_Wylegów_NET.Services;
using System.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Hosting.StaticWebAssets;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Localization;
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddMudServices();
builder.Services.AddHttpClient();
builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets();

builder.Services.AddSingleton<DatabaseService>();
builder.Services.AddBlazoredSessionStorage();

//builder.Services.AddSingleton<CounterService>(); 
//builder.Services.AddHostedService(sp => sp.GetRequiredService<CounterService>());
builder.Services.AddSingleton<UserInfo>();
builder.Services.AddScoped<AuthenticationStateProvider, SimpleAuthenticationStateProvider>();

builder.Services.AddServerSideBlazor();

builder.Services.AddAuthentication();

builder.Services.AddMudServices(config =>
{

    config.SnackbarConfiguration.PreventDuplicates = false;
    config.SnackbarConfiguration.NewestOnTop = false;
    config.SnackbarConfiguration.ShowCloseIcon = true;

    config.SnackbarConfiguration.VisibleStateDuration = 20000;
    config.SnackbarConfiguration.HideTransitionDuration = 500;
    config.SnackbarConfiguration.ShowTransitionDuration = 500;
;
});


var app = builder.Build();

var culture = new CultureInfo("en-US");
culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
var supportedCultures = new List<CultureInfo> { culture };
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture(culture, culture),
    // Formatting numbers, dates, etc.
    SupportedCultures = supportedCultures,
    // UI strings that we have localized.
    SupportedUICultures = supportedCultures
});

app.UseStaticFiles();
app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();
1

Pokaż jeszcze zawartość pliku .csproj, bo coś mi się wydaje że tam możesz mieć namieszane i appsettingsy nie są kopiowane do wynikowej paczki.

0
some_ONE napisał(a):

Pokaż jeszcze zawartość pliku .csproj, bo coś mi się wydaje że tam możesz mieć namieszane i appsettingsy nie są kopiowane do wynikowej paczki.

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <RootNamespace>Aplikacja TESTOWA</RootNamespace>
    <FileVersion>1.0</FileVersion>
    <AssemblyVersion>1.0.0.10</AssemblyVersion>
    <Title>Aplikacja TESTOWA</Title>
    <GeneratePackageOnBuild>False</GeneratePackageOnBuild>
  </PropertyGroup>

  <ItemGroup>
    <Content Remove="Pages\logowanie\OknoLogowania.razor" />
    <Content Remove="Properties\PublishProfiles\launchSettings.Production.json" />
  </ItemGroup>

  <ItemGroup>
    <_WebToolingArtifacts Remove="Properties\PublishProfiles\launchSettings.Production..json" />
  </ItemGroup>

  <ItemGroup>
    <None Include="wwwroot\Grafika\kurczak.png" />
  </ItemGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Blazored.SessionStorage" Version="2.3.0" />
    <PackageReference Include="Dapper" Version="2.0.123" />
    <PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
    <PackageReference Include="itext7" Version="8.0.0" />
    <PackageReference Include="itext7.bouncy-castle-adapter" Version="8.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="6.0.18" />
    <PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" />
    <PackageReference Include="MudBlazor" Version="6.8.0" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
    <PackageReference Include="Npgsql" Version="7.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Layout\" />
    <Folder Include="Properties\PublishProfiles\" />
  </ItemGroup>
</Project>
1

Albo jestem ślepy, albo nie widzę, żebyś skorzystał z rady S4t, a to powinno pomóc ;)

Ewentualnie dla wielu różnych środowisk automatycznie

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider, IServer server)
{
    var configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .Build();
}
0
heyyou napisał(a):

Albo jestem ślepy, albo nie widzę, żebyś skorzystał z rady S4t, a to powinno pomóc ;)

Ewentualnie dla wielu różnych środowisk automatycznie

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider, IServer server)
    {
     
        
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .Build();
    }

Właśnie wkleiłem ten kod do Program.cs i taka sytuacja

screenshot-20231025133626.png

0

Ślepy to może nie, ale w nowszych wersjach ASP.NET Core jest to dodawane automatycznie przez WebApplication.CreateBuilder() :P
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0#default-application-configuration-sources

0
virusek391 napisał(a):
heyyou napisał(a):

Albo jestem ślepy, albo nie widzę, żebyś skorzystał z rady S4t, a to powinno pomóc ;)

Ewentualnie dla wielu różnych środowisk automatycznie

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider, IServer server)
    {
     
        
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .Build();
    }

Właśnie wkleiłem ten kod do Program.cs i taka sytuacja

screenshot-20231025133626.png

Mój kod wygląda teraz tak i nadal nic :(

internal class Program
{
    private static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddRazorPages();
        builder.Services.AddMudServices();
        builder.Services.AddHttpClient();
        builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets();

        builder.Services.AddSingleton<DatabaseService>();
        builder.Services.AddBlazoredSessionStorage();

        //builder.Services.AddSingleton<CounterService>(); //Aby uruchomic usługę w tle z odliczeniem trzeba dodać te dwie linijki kodu
        //builder.Services.AddHostedService(sp => sp.GetRequiredService<CounterService>());
        builder.Services.AddSingleton<UserInfo>();
        builder.Services.AddScoped<AuthenticationStateProvider, SimpleAuthenticationStateProvider>();

        builder.Services.AddServerSideBlazor();

        builder.Services.AddAuthentication();

        builder.Services.AddMudServices(config =>
        {

            config.SnackbarConfiguration.PreventDuplicates = false;
            config.SnackbarConfiguration.NewestOnTop = false;
            config.SnackbarConfiguration.ShowCloseIcon = true;

            config.SnackbarConfiguration.VisibleStateDuration = 20000;
            config.SnackbarConfiguration.HideTransitionDuration = 500;
            config.SnackbarConfiguration.ShowTransitionDuration = 500;
            ;
        });

        var app = builder.Build();

        //Formatuje sposób wyświetlania daty podczas korzystania z aplikacji
        var culture = new CultureInfo("en-US");
        culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
        var supportedCultures = new List<CultureInfo> { culture };
        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture(culture, culture),
            // Formatting numbers, dates, etc.
            SupportedCultures = supportedCultures,
            // UI strings that we have localized.
            SupportedUICultures = supportedCultures
        });

        app.UseStaticFiles();
        app.UseRouting();

        app.MapBlazorHub();
        app.MapFallbackToPage("/_Host");

        app.Run();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider, IServer server)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false)
            .Build();
    }
}

1

Bo nigdzie tego nie używasz ;)

some_ONE odpisal w komentarzu, ze teraz to sie dzieje automatycznie i faktycznie tak jest :O

W starszych wersjach mogles np. w klasie Startup przypisac
Configuration = configuration

Jakiej wersji asp .net core używasz w tym projekcie ?

Btw, możesz na deubgu podejrzeć co siedzi pod Configuration - nałatwiej w metodzie Configure wpisz sobie przykładowo

var x = Configuration i podejrzyj jakich tam masz providerów:

screenshot-20231025182347.png

0
heyyou napisał(a):

Jakiej wersji asp .net core używasz w tym projekcie ?

Używam ASP .NET CORE (NET. 6) + Blazor

Co ciekawe jak uruchomię program z parametrem:

dotnet watch run  --launch-profile="Development"

to wczytuje mi zawartość profilu Development tylko zamiast pliku appsettings.Development.json ładuje appsettings..json :(

zawartość pliku launchSettings.json:

"Development": {
    "commandName": "Project",
    "launchBrowser": true,
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    },
    "dotnetRunMessages": true,
    "applicationUrl": "http://192.168.1.4:5002"

Oto zawartość pliku Program.cs

using Blazored.SessionStorage;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web;

using MudBlazor.Services;
using Rejestr_Wylegów_NET;
using Rejestr_Wylegów_NET.Models;
using Rejestr_Wylegów_NET.Services;
using System.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Hosting.StaticWebAssets;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Localization;
using System.Globalization;
using System.Reflection;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting.Server;

internal class Program
{

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider, IServer server)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .Build();
    }

    private static void Main(string[] args)
    {

        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddRazorPages();
        builder.Services.AddMudServices();
        builder.Services.AddHttpClient();
        builder.WebHost.UseWebRoot("wwwroot").UseStaticWebAssets();

        builder.Services.AddSingleton<DatabaseService>();
        builder.Services.AddBlazoredSessionStorage();

        builder.Services.AddSingleton<UserInfo>();
        builder.Services.AddScoped<AuthenticationStateProvider, SimpleAuthenticationStateProvider>();

        builder.Services.AddServerSideBlazor();

        builder.Services.AddAuthentication();

        builder.Services.AddMudServices(config =>
        {
            config.SnackbarConfiguration.PreventDuplicates = false;
            config.SnackbarConfiguration.NewestOnTop = false;
            config.SnackbarConfiguration.ShowCloseIcon = true;

            config.SnackbarConfiguration.VisibleStateDuration = 20000;
            config.SnackbarConfiguration.HideTransitionDuration = 500;
            config.SnackbarConfiguration.ShowTransitionDuration = 500;
            ;
        });

        var app = builder.Build();

        var culture = new CultureInfo("en-US");
        culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
        var supportedCultures = new List<CultureInfo> { culture };
        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture(culture, culture),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        });

        app.UseStaticFiles();
        app.UseRouting();

        app.MapBlazorHub();
        app.MapFallbackToPage("/_Host");

        app.Run();

       
    }


}

Zawartość zmiennej:

ASPNETCORE_ENVIRONMENT = Development

Rozwiązanie problemu:
Na początku chciałbym podziękować wszystkim za pomoc :)
Okazało się że problem leżał w konfiguracji moich serwisów, ponieważ miałem tam na sztywno ustawioną nazwę appsettings.json zamiast

  configurationBuilder.AddJsonFile($"appsettings.{enviroment}.json");

nawet nie musiałem nic zmieniać w pliku Program.cs

1 użytkowników online, w tym zalogowanych: 0, gości: 1