Publikasikan ke IIS, atur Variabel Lingkungan

134

Membaca dua pertanyaan / jawaban ini saya dapat menjalankan aplikasi Asp.net 5 di server IIS 8.5.

Asp.net vNext beta awal diterbitkan ke IIS di windows server

Bagaimana cara mengkonfigurasi aplikasi MVC6 agar berfungsi pada IIS?

Masalahnya adalah bahwa aplikasi web masih menggunakan env.EnvironmentNamedengan nilai Developmentbahkan ketika dijalankan di IIS.

Juga, saya ingin menjalankan dua versi Web yang sama (Pementasan, Produksi) pada server yang sama, jadi saya perlu metode untuk mengatur variabel untuk setiap Web secara terpisah.

Bagaimana cara melakukannya?

drpdrp
sumber
4
Biasanya ada tiga lingkungan jaringan Pengembangan, Staging dan Produksi. Server web berada dalam satu lingkungan. Jadi pengaturan variabel lingkungan sistem untuk server bukanlah batasan nyata. Satu masih dapat digunakan Properties\launchSettings.jsonuntuk mensimulasikan lingkungan lain untuk debugging di Visual Studio.
Oleg

Jawaban:

286

Jawaban ini awalnya ditulis untuk ASP.NET Core RC1. Dalam RC2 ASP.NET Core pindah dari handler httpPlafrom generik ke aspnetCore yang spesifik. Perhatikan bahwa langkah 3 tergantung pada versi ASP.NET Core apa yang Anda gunakan.

Ternyata variabel lingkungan untuk proyek-proyek ASP.NET Core dapat diatur tanpa harus menetapkan variabel lingkungan untuk pengguna atau harus membuat beberapa entri perintah.

  1. Buka aplikasi Anda di IIS dan pilih Configuration Editor.
  2. Pilih Configuration Editor
  3. Pilih system.webServer/aspNetCore(RC2 dan RTM) atau system.webServer/httpPlatform(RC1) dalam kotak Sectionkombo
  4. Pilih Applicationhost.config ...dalam kotak Fromkombo.
  5. Klik kanan pada enviromentVariableselemen, pilih 'environmentVariables' element, lalu Edit Items. masukkan deskripsi gambar di sini
  6. Tetapkan variabel lingkungan Anda.
  7. Tutup jendela dan klik Terapkan.
  8. Selesai

Dengan cara ini Anda tidak perlu membuat pengguna khusus untuk kumpulan Anda atau membuat entri perintah tambahan project.json. Juga, menambahkan perintah khusus untuk setiap kerusakan lingkungan "build sekali, sebarkan berkali-kali" karena Anda harus memanggil dnu publishsecara terpisah untuk setiap lingkungan, alih-alih menerbitkan sekali dan menggunakan artefak yang dihasilkan berkali-kali.

Diperbarui untuk RC2 dan RTM, terima kasih kepada Mark G dan tredder.

NickAb
sumber
12
Untuk langkah 3 saya gunakan system.webServer/aspNetCoresebagai gantinya.
Mark G
1
Variabel lingkungan sistem diwariskan oleh proses di awal. Jadi, jika Anda mengubah beberapa variabel env saat menjalankan aplikasi Anda, Anda tidak akan dapat melihat perubahan ini secara default. Agar perubahan sistem berlaku, Anda harus setidaknya me-restart situs, mungkin kumpulan, atau bahkan layanan IIS, tergantung pada bagaimana IIS menciptakan proses. Ini perlu diuji.
NickAb
7
Tidak akankah pengaturan yang ditambahkan melalui Editor Konfigurasi dihapuskan pada penyebaran berikutnya?
Brad Gardner
11
@ brad-gardner jika ada perubahan pada Applicationhost.config alih-alih web.config, maka perubahan akan tetap ada di antara penerapan.
NickAb
15
Bekerja untuk Asp.Net Core 2.0
Frank Cannon
34

Perbarui web.config dengan bagian <environmentVariables> di bawah <aspNetCore>

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

Atau untuk menghindari kehilangan pengaturan ini saat menimpa web.config, buat perubahan serupa ke applicationHost.config dengan menetapkan lokasi situs seperti yang disarankan @NickAb.

<location path="staging.site.com">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>
<location path="production.site.com">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>
Trevor Daniels
sumber
2
Ini berbeda dengan cara web.config Anda adalah bagian dari proyek dan versi dalam VCS. Jika Anda memiliki beberapa lingkungan, seperti prod, staging, dev, maka Anda perlu beberapa cara untuk mengubah web.config untuk masing-masingnya. Mengubah ApplicationHost.config di IIS hanya memengaruhi IIS ini. Sehingga Anda dapat memiliki web.config tunggal di VCS Anda dan variabel lingkungan khusus untuk IIS yang menimpa variabel web.config. ApplicationHost.config dapat diedit secara programatis menggunakan PowerShell iis.net/learn/manage/powershell/…
NickAb
Terima kasih @NickAb, yang menghindari keharusan memperbarui web.config setiap penyebaran. Saya telah memperbarui jawaban saya.
Trevor Daniels
Saya mengalami masalah dengan melakukan ini dari PowerShell saya terus mendapatkan Target configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ... Biasanya untuk menetapkan beberapa variabel saya akan menulis sesuatu seperti ini: Set-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging apa yang saya hilang?
Christian
Saya kembali ke apa yang saya tahu dan gunakan appcmd.
Christian
@Christian, periksa jawaban ini: stackoverflow.com/a/50869935/33533 Variabel nama lingkungan dan nilai masuk dalam tabel hash, jadi dari contoh Anda akanSet-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Curtis Buys
21

Sunting: pada rilis RC2 dan RTM, saran ini kedaluwarsa. Cara terbaik yang saya temukan untuk menyelesaikan ini dalam rilis adalah dengan mengedit bagian web.config berikut di IIS untuk setiap lingkungan:

system.webServer/aspNetCore:

Edit entri environmentVariable dan tambahkan pengaturan variabel lingkungan:

ASPNETCORE_ENVIRONMENT : < Your environment name >


Sebagai alternatif dari pendekatan drpdrp, Anda dapat melakukan hal berikut:

  • Di project.json Anda, tambahkan perintah yang meneruskan variabel ASPNET_ENV langsung ke Kestrel:

    "commands": {
        "Development": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Development",
        "Staging": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Staging",
        "Production": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Production"
    }
    
  • Saat menerbitkan, gunakan --iis-commandopsi untuk menentukan lingkungan:

    dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
    

Saya menemukan pendekatan ini kurang mengganggu daripada menciptakan pengguna IIS tambahan.

Joshua Barron
sumber
11
Jika Anda menerbitkan melalui msdeploy visual studio. Kemudian Anda dapat meletakkan <IISCommand> Staging </IISCommand> dalam file .pubxml Anda dan itu akan disebarkan menggunakan perintah IIS yang ditentukan meskipun Anda tidak dapat menentukannya di UI terbitkan.
Dean North
@DeanNorth - Ini emas !! Bekerja seperti jagoan! Terima kasih telah berbagi!
S. Rasmussen
17

Saya memiliki aplikasi web saya (PRODUCTION, STAGING, TEST) di-host di server web IIS. Jadi tidak mungkin untuk bergantung pada variabel lingkungan sistem operatif ASPNETCORE_ENVIRONMENT, karena mengaturnya ke nilai tertentu (misalnya STAGING) berpengaruh pada aplikasi lain.

Sebagai solusi, saya mendefinisikan file khusus (envsettings.json) dalam solusi visualstudio saya:

masukkan deskripsi gambar di sini

dengan konten berikut:

{
  // Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
  // - Production
  // - Staging
  // - Test
  // - Development
  "ASPNETCORE_ENVIRONMENT": ""
}

Kemudian, berdasarkan pada jenis aplikasi saya (Produksi, Pementasan atau Uji) saya mengatur file ini sesuai: seandainya saya menggunakan aplikasi TEST, saya akan memiliki:

"ASPNETCORE_ENVIRONMENT": "Test"

Setelah itu, dalam file Program.cs hanya mengambil nilai ini dan kemudian mengatur lingkungan webHostBuilder:

    public class Program
    {
        public static void Main(string[] args)
        {
            var currentDirectoryPath = Directory.GetCurrentDirectory();
            var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
            var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
            var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

            var webHostBuilder = new WebHostBuilder()
                .UseKestrel()
                .CaptureStartupErrors(true)
                .UseSetting("detailedErrors", "true")
                .UseContentRoot(currentDirectoryPath)
                .UseIISIntegration()
                .UseStartup<Startup>();

            // If none is set it use Operative System hosting enviroment
            if (!string.IsNullOrWhiteSpace(enviromentValue)) 
            { 
                webHostBuilder.UseEnvironment(enviromentValue);
            }

            var host = webHostBuilder.Build();

            host.Run();
        }
    }

Ingatlah untuk menyertakan envsettings.json dalam publishOptions (project.json):

  "publishOptions":
  {
    "include":
    [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "envsettings.json",
      "appsettings.json",
      "appsettings*.json",
      "web.config"
    ]
  },

Solusi ini membuat saya bebas untuk memiliki aplikasi ASP.NET CORE yang di-host pada IIS yang sama, terlepas dari nilai variabel envoroment.

Christian Del Bianco
sumber
Sangat bagus, satu-satunya perubahan yang saya sarankan adalah swap var currentDirectoryPath = Directory.GetCurrentDirectory (); untuk var currentDirectoryPath = PlatformServices.Default.Application.ApplicationBasePath; Ini jauh lebih aman untuk mendapatkan dir saat ini.
Peter Kottas
7
Betapa hebatnya pengalaman di luar kotak, ketika Anda harus membuat lapisan konfigurasi lain untuk mengelola konfigurasi kerangka kerja
Kugel
16

Setelah googling ekstensif saya menemukan solusi yang berfungsi, yang terdiri dari dua langkah.

Langkah pertama adalah mengatur variabel lingkungan sistem lebar ASPNET_ENV ke Produksi dan Restart Windows Server . Setelah ini, semua aplikasi web mendapatkan nilai 'Produksi' sebagai EnvironmentName.

Langkah kedua (untuk mengaktifkan nilai 'Pementasan' untuk pementasan web) agak lebih sulit untuk bisa berfungsi dengan benar, tetapi ini dia:

  1. Buat pengguna windows baru, misalnya StagingPool di server.
  2. Untuk pengguna ini, buat variabel pengguna baru ASPNETCORE_ENVIRONMENT dengan nilai 'Staging' (Anda dapat melakukannya dengan masuk sebagai pengguna ini atau melalui regedit)
  3. Kembali sebagai admin di manajer IIS, cari Pool Aplikasi di mana web Staging sedang berjalan dan dalam Pengaturan Lanjut atur Identity ke pengguna StagingPool .
  4. Juga atur Load User Profile menjadi true , sehingga variabel lingkungan dimuat. <- sangat penting!
  5. Pastikan StagingPool memiliki hak akses ke folder web dan Stop dan Mulai Aplikasi Pool.

Sekarang web Staging harus memiliki EnvironmentName diatur ke 'Staging'.

Pembaruan: Di Windows 7+ ada perintah yang dapat mengatur variabel lingkungan dari CMD prompt juga untuk pengguna tertentu. Output ini membantu plus sampel:

>setx /?
drpdrp
sumber
1
Tampaknya dalam ASP.NET 5 RC1, variabel lingkungan diubah menjadi Hosting: Lingkungan.
Grady Werner
Bagaimana kami mengatur "Muat Profil Pengguna" menjadi benar ketika kami menyebarkan ini ke Azure Web App?
Puneet Ghanshani
@PunitGanshani Seperti yang saya mengerti, ada bagian "pengaturan aplikasi" di portal biru untuk aplikasi web tempat Anda dapat mengatur pasangan kunci / nilai lingkungan: azure.microsoft.com/en-us/documentation/articles/…
drpdrp
@ GradyWerner Untuk RC2 mereka mengubahnya (seperti yang sekarang) menjadi ASPNET_ENVIRONMENT ;-)
b.pell
1
@ b.pell Tampaknya sekarang ASPNETCORE_ENVIRONMENT :)
Mark G
11

Atau Anda bisa meneruskan yang diinginkan ASPNETCORE_ENVIRONMENTke dalam perintah dotnet publish sebagai argumen menggunakan:

/p:EnvironmentName=Staging

misalnya:

dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

Ini akan menghasilkan web.config dengan lingkungan yang benar yang ditentukan untuk proyek Anda:

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
Sheldon Nunes
sumber
9

Selain opsi yang disebutkan di atas, ada beberapa Solusi lain yang bekerja dengan baik dengan penyebaran otomatis atau memerlukan lebih sedikit perubahan konfigurasi.

1. Memodifikasi file proyek (.CsProj) file

MSBuild mendukung EnvironmentNameProperti yang dapat membantu mengatur variabel lingkungan yang tepat sesuai Lingkungan yang ingin Anda Gunakan. Nama lingkungan akan ditambahkan di web.config selama fase Publikasikan.

Cukup buka file proyek (* .csProj) dan tambahkan XML berikut.

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

Kode di atas akan menambahkan nama lingkungan Developmentuntuk konfigurasi Debug atau jika tidak ada konfigurasi yang ditentukan. Untuk Konfigurasi lainnya, nama Lingkungan akan berada Productiondi file web.config yang dibuat. Lebih detail di sini

2. Menambahkan Properti EnvironmentName di profil terbitkan.

Kami dapat menambahkan <EnvironmentName>properti di profil terbitkan juga. Buka file profil publikasikan yang terletak di Properties/PublishProfiles/{profilename.pubxml}Ini akan mengatur nama Lingkungan di web.config ketika proyek diterbitkan. Lebih detail di sini

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. Opsi baris perintah menggunakan dotnet publish

Selain itu, kita bisa meneruskan properti EnvironmentNamesebagai opsi baris perintah ke dotnet publishperintah. Perintah berikut akan menyertakan variabel lingkungan seperti Developmentpada file web.config.

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development

Abhinav Galodha
sumber
7

Untuk memperluas jawaban @ tredder, Anda dapat mengubah environmentVariables menggunakan appcmd

Pementasan

%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST

Produksi

%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST

Kristen
sumber
Berikut adalah cara mencapai hal yang sama dengan Powershell pada server build tanpa IIS diinstal. gist.github.com/markarnott/c4aec1fc544fe89e2bd21f3f00d78933
Mark Arnott
Menentukan "staging.example.com" atau "example.com" hanya akan menerapkan variabel ke situs web tertentu. Menghilangkan hal itu akan membuat variabel global untuk semua situs web di server.
deadlydog
6

Apa yang perlu Anda ketahui di satu tempat:

  • Agar variabel lingkungan menimpa pengaturan konfigurasi, mereka harus diawali dengan ASPNETCORE_.
  • Jika Anda ingin mencocokkan node anak di konfigurasi JSON Anda, gunakan :sebagai pemisah. Jika platform tidak mengizinkan titik dua dalam kunci variabel lingkungan, gunakan __saja.
  • Anda ingin pengaturan Anda berakhir ApplicationHost.config. Menggunakan Editor Konfigurasi IIS akan menyebabkan input Anda ditulis ke aplikasi Web.config- dan akan ditimpa dengan penyebaran selanjutnya!
  • Untuk memodifikasi ApplicationHost.config, Anda ingin menggunakan appcmd.exeuntuk memastikan modifikasi Anda konsisten. Contoh:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site

  • Karakter yang bukan URL-safe dapat diloloskan sebagai Unicode, seperti %u007buntuk braket keriting kiri.

  • Untuk daftar pengaturan Anda saat ini (dikombinasikan dengan nilai-nilai dari Web.config): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • Jika Anda menjalankan perintah untuk mengatur kunci konfigurasi beberapa kali untuk kunci yang sama, itu akan ditambahkan beberapa kali! Untuk menghapus nilai yang ada, gunakan sesuatu seperti %systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:site.
realMarkusSchmidt
sumber
1
perhatikan bahwa dengan /commit:siteperubahan ditulis di web.config, untuk menyimpannya ApplicationHost.configharus digunakan/commit:apphost
Angel Yordanov
-section:system.webServer/aspNetCore /-"environmentVariables.(dengan minus untuk menghapus variabel lingkungan) gagal dijalankan selama pipa rilis Azure. Kesalahannya adalah hresult:80070032, message:Command execution failed. Namun clear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:siteberfungsi dengan baik. Itu menghapus bagian aspNetCore keseluruhan untuk situs web tetapi tidak masalah karena parametrized selama rilis.
oleksa
6

Mirip dengan jawaban lain, saya ingin memastikan pengaturan lingkungan ASP.NET Core 2.1 saya bertahan di seluruh penyebaran, tetapi juga hanya berlaku untuk situs tertentu.

Menurut dokumentasi Microsoft, dimungkinkan untuk mengatur variabel lingkungan di kumpulan aplikasi menggunakan perintah PowerShell berikut di IIS 10:

$appPoolName = "AppPool"
$envName = "Development"
cd "$env:SystemRoot\system32\inetsrv"
.\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='$appPoolName'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='$envName']" /commit:apphost

Sayangnya saya masih harus menggunakan IIS 8.5 dan berpikir saya kurang beruntung. Namun, masih dimungkinkan untuk menjalankan skrip PowerShell sederhana untuk menetapkan nilai variabel lingkungan khusus situs untuk ASPNETCORE_ENVIRONMENT:

Import-Module -Name WebAdministration
$siteName = "Site"
$envName = "Development"
Set-WebConfigurationProperty -PSPath IIS:\ -Location $siteName -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = $envName }
dasch88
sumber
5

Solusi @tredder dengan mengedit applicationHost.config adalah yang berfungsi jika Anda memiliki beberapa aplikasi berbeda yang terletak di dalam direktori virtual di IIS.

Kasus saya adalah:

  • Saya punya proyek API dan proyek APP , di bawah domain yang sama, ditempatkan di direktori virtual yang berbeda
  • Root halaman XXX tampaknya tidak menyebarkan variabel ASPNETCORE_ENVIRONMENT ke anak-anaknya di direktori virtual dan ...
  • ... Saya tidak dapat mengatur variabel di dalam direktori virtual seperti yang dijelaskan @NickAb (mendapat kesalahan Permintaan tidak didukung. (Pengecualian dari HRESULT: 0x80070032) selama menyimpan perubahan di Editor Konfigurasi):
  • Masuk ke applicationHost.config dan secara manual membuat node seperti ini:

    <location path="XXX/app"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location> <location path="XXX/api"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location>

dan memulai kembali IIS melakukan pekerjaan.

Bartosz Lenar
sumber
0

Untuk mendapatkan rincian tentang kesalahan saya harus menambahkan ASPNETCORE_ENVIRONMENTvariabel lingkungan untuk Pool Aplikasi yang sesuai system.applicationHost/applicationPools .

Catatan: aplikasi web dalam kasus saya adalah ASP.NET Core 2aplikasi web yang dihosting pada IIS 10. Ini dapat dilakukan melalui Configuration Editordalam IIS Manager(lihat Mengedit Koleksi dengan Editor Konfigurasi untuk mengetahui di mana menemukan editor ini IIS Manager).

Dmitry Pavlov
sumber
0

Saya telah membuat repositori untuk menerbitkan IIS dengan konfigurasi lingkungan di Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Mempersiapkan
    • Dapatkan bagian dari file .csproj dan .user.csproj ke file proyek Anda.
    • Dapatkan file MyAspNetEnvironment.props, web.development.config dan web.production.config.
  • Konfigurasi
    • Ubah nilai properti ASPNETCORE_ENVIRONMENT di user.csproj secara relevan.
subkoder
sumber
Ini sepertinya tidak memberikan jawaban yang berkualitas untuk pertanyaan itu. Harap edit jawaban Anda dengan menambahkan perincian keseluruhan dari solusi ini, atau cukup hapus dan kirimkan sebagai komentar untuk pertanyaan. Terima kasih!
sɐunıɔ ןɐ qɐp
0

Saya telah memodifikasi jawaban yang diberikan @Christian Del Bianco . Saya mengubah proses untuk .net core 2 dan lebih tinggi sebagai file project.json sekarang mutlak.

  1. Pertama, buat file appsettings.json di direktori root. dengan konten

      {
         // Possible string values reported below. When empty it use ENV 
            variable value or Visual Studio setting.
         // - Production
         // - Staging
         // - Test
        // - Development
       "ASPNETCORE_ENVIRONMENT": "Development"
     }
    
  2. Kemudian buat dua pengaturan lain file appsettings.Development.json dan appsettings.Production.json dengan konfigurasi yang diperlukan.

  3. Tambahkan kode yang diperlukan untuk mengatur lingkungan ke file Program.cs .

    public class Program
    {
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    
      ***var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();***
    
        try
        {
            ***CreateWebHostBuilder(args, enviromentValue).Build().Run();***
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Error(ex, "Stopped program because of setup related exception");
            throw;
        }
        finally
        {
            NLog.LogManager.Shutdown();
        }
    }
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args, string enviromentValue) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()
            ***.UseEnvironment(enviromentValue);***
    

    }

  4. Tambahkan envsettings.json untuk Anda .csproj file untuk copy ke direktori diterbitkan.

       <ItemGroup>
            <None Include="envsettings.json" CopyToPublishDirectory="Always" />
        </ItemGroup>
    
  5. Sekarang cukup ubah ASPNETCORE_ENVIRONMENT seperti yang Anda inginkan dalam file envsettings.json dan diterbitkan.

Md. Nazrul Islam
sumber