Parametryzowanie ustawień uruchomieniowych wersji deweloperskiej i produkcyjnej

0

Dzień dobry, mam utworzone dwa profile w launchsettings.json

 "Dev": {
   "commandName": "Project",
   "launchBrowser": false,
   "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT ": "development"
   },
   "dotnetRunMessages": true,
   "applicationUrl": "http://192.168.1.4:5001"
 },
 "Prod": {
   "commandName": "Project",
   "launchBrowser": false,
   "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT ": "production"
   },
   "dotnetRunMessages": true,
   "applicationUrl": "http://192.168.1.4:5001"
 },

oraz dwa pliki appsettings.development.json i appsettings.production.json
Teraz gdy uruchamiam program w trybie debugowania za pomocą profilu ,,Dev" powinien załadować mi plik appsettings.development.json, a on pomimo tego ładuje mi production :(

info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://192.168.1.4:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]

z powyższej informacji widzę że przyczyną tej sytuacji może być to że ładuje on nazwę zmiennej Production. Co ciekawe w samym projekcie nie widzę nigdzie wpisu, gdzie miałbym nazwę zmiennej zaczynającej się z wielkiej litery :(

Poniżej przesyłam jeszcze dodatkowe informacje

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.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;

namespace Rejestr_Wylegów_NET
{
    public static class WebApplicationBuilder
    {
        public static IHostBuilder ConfigureAppSettings(this IHostBuilder host)
        {
            var enviroment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            host.ConfigureAppConfiguration((ctx, builder) =>
            {
                builder.AddJsonFile("appsettings.json", false, true);
                builder.AddJsonFile($"appsettings.{enviroment}.json", true, true);
                builder.AddEnvironmentVariables();
            });

            return host;
        }
    }
    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<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;
               
            });
            builder.Host.ConfigureAppSettings();
            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();

        }

    }
}

Project.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <RootNamespace>Rejestr_Wylegów_NET</RootNamespace>
    <FileVersion>1.0</FileVersion>
    <AssemblyVersion>1.0.0.15</AssemblyVersion>
  </PropertyGroup>

  <ItemGroup>
    <Content Remove="Pages\logowanie\OknoLogowania.razor" />

  </ItemGroup>

  <ItemGroup>
    <None Include="wwwroot\Grafika\kurczak.png" />
    <None Include="wwwroot\Grafika\pic_raport.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\" />
    <Folder Include="wwwroot\pictures\" />
  </ItemGroup>

  <ItemGroup>
    <Compile Update="Properties\Resources.Designer.cs">
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
  </ItemGroup>

  <ItemGroup>
    <Content Update="appsettings.production.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update="appsettings.development.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>
</Project>

Dodam również że w samym systemie Windows nie posiadam zmiennej użytkownika jak i systemowej ASPNETCORE_ENVIRONMENT, mam ją tylko w samym środowisku Visual Studio we wcześniej wspomnianym profilu.

0

Czy to nie jest ten sam problem który miałeś tutaj? Parametryzowanie ustawień uruchomieniowych wersji deweloperskiej i produkcyjnej

0
Riddle napisał(a):

Czy to nie jest ten sam problem który miałeś tutaj? Parametryzowanie ustawień uruchomieniowych wersji deweloperskiej i produkcyjnej

Tam był trochę inny problem, ponieważ wczytywał mi tylko plik appsettings, natomiast tutaj mam problem tego typu że wczytuje mi tylko zmienną Production :(

0

Ten launchsettings.json jest dokładnie taki jak tutaj wkleiłeś? Jeśli tak to spróbuj dodać "profiles" : { ... } i sprawdź czy w VS pokazuje Ci się ten profil pod przyciskiem "Start/Debug" projektu.

0
jarzi napisał(a):

Ten launchsettings.json jest dokładnie taki jak tutaj wkleiłeś? Jeśli tak to spróbuj dodać "profiles" : { ... } i sprawdź czy w VS pokazuje Ci się ten profil pod przyciskiem "Start/Debug" projektu.

launchsettings.json zawiera oczywiście również inne profile, tylko myślałem że w tej sytuacji nie będą one istotne: Poniżej znajduję się całość tego pliku

{
  "profiles": {
    "http": {
      "commandName": "Project",
      "launchBrowser": true,
      "dotnetRunMessages": true,
      "applicationUrl": "http://localhost:5001"
    },
    "Dev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT ": "development"
      },
      "dotnetRunMessages": true,
      "applicationUrl": "http://192.168.1.4:5001"
    },
    "Prod": {
      "commandName": "Project",
      "launchBrowser": false,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT ": "production"
      },
      "dotnetRunMessages": true,
      "applicationUrl": "http://192.168.1.4:5001"
    },
    "WSL": {
      "commandName": "WSL2",
      "launchBrowser": true,
      "launchUrl": "http://0.0.0.0:5001",
      "environmentVariables": {
        "ASPNETCORE_URLS": "http://0.0.0.0:5001"
      },
      "distributionName": ""
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASP": "DEV"
      }
    }
  },
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:30009",
      "sslPort": 0
    }
  }
}

W Microsoft Visual Studio 2022 pojawia mi się ten profil pod przyciskiem "Start/Debug"
screenshot-20231122204729.png
Teraz zauważyłem że do appsettings przekazywana jest zawartość zmiennej, którą utworzyłem w zmiennych środowiskowych systemu Windows.
Czyli powiedzmy że w zmiennej systemowej utworze ASPNETCORE_ENVIRONMENT = development to pomimo że uruchomię w VS profil ,,Prod" który zawiera wpis ASPNETCORE_ENVIRONMENT = production to i tak program uruchomi się przy użyciu ASPNETCORE_ENVIRONMENT = development

0

A jak wygląda appsettings.development.json ?

0
jarzi napisał(a):

A jak wygląda appsettings.development.json ?

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


  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Db_Connection": "Server=192.168.1.5;Port=5432;Database=baza;User Id=postgres;Password=XXXXX;"
  }
}

On wczytuje mi zawartość profilu development i production, tylko problem jest taki że zrobi to dopiero jak ustawie ASPNETCORE_ENVIRONMENT poza VS, czyli w zmiennych środowiskowych systemu Windows, natomiast jak usunę zmienną środowiskową ASPNETCORE_ENVIRONMENT w samym Windowsie to nie wiem z skąd wczytuje mi wciąż profil Production :(

4

Może chodzi o to, że tu masz spację?
"ASPNETCORE_ENVIRONMENT ": "production" -> "ASPNETCORE_ENVIRONMENT<o_tu_spacja> ": "production"
Powinno być:
"ASPNETCORE_ENVIRONMENT": "production"

0

Polecam włączyć wyświetlanie białych znaków (whitespaces) nie wiem jak po Polsku, w IDE/Edytorze. Łatwiej wtedy znaleźć takie coś.

0
froziu napisał(a):

Może chodzi o to, że tu masz spację?
"ASPNETCORE_ENVIRONMENT ": "production" -> "ASPNETCORE_ENVIRONMENT<o_tu_spacja> ": "production"
Powinno być:
"ASPNETCORE_ENVIRONMENT": "production"

I masz racje. Po usunięciu spacji wszystko działa. Dzięki wielkie :)

0
jarzi napisał(a):

A jak wygląda appsettings.development.json ?

Okazało się że tak jak napisał kolega @froziu miałem spacje zeobioną za ASPNETCORE_ENVIRONMENT. Dziękuję również za próbę pomocy w rozwiązaniu problemu :)

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