Mengonfigurasi aplikasi ASP.NET Core untuk Azure App Service

Catatan

Untuk ASP.NET di .NET Framework, lihat Mengonfigurasi aplikasi ASP.NET untuk Azure App Service. Jika aplikasi ASP.NET Core Anda berjalan di kontainer Windows atau Linux kustom, lihat Mengonfigurasi kontainer kustom untuk Azure App Service.

Aplikasi ASP.NET Core harus disebarkan ke Azure App Service sebagai biner yang dikompilasi. Alat penerbitan Visual Studio membangun solusi dan kemudian menyebarkan biner yang dikompilasi secara langsung, sedangkan mesin penyebaran App Service menerapkan repositori kode terlebih dahulu, kemudian mengompilasi biner.

Panduan ini menyediakan konsep dan instruksi utama untuk pengembang ASP.NET Core. Jika Anda belum pernah menggunakan Azure App Service, ikuti mulai cepat ASP.NET Core dan ASP.NET Core dengan tutorial SQL Database terlebih dahulu.

Tampilkan versi runtime .NET Core yang didukung

Di Azure App Service, instans Jendela sudah memasang semua versi .NET Core yang didukung. Untuk menampilkan runtime .NET Core dan versi SDK yang tersedia untuk Anda, navigasikan ke https://<app-name>.scm.azurewebsites.net/DebugConsole dan jalankan perintah berikut di konsol berbasis browser:

dotnet --info

Tampilkan versi .NET Core

Untuk menampilkan versi .NET Core saat ini, jalankan perintah berikut ini di Cloud Shell:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

Untuk menampilkan semua versi .NET Core yang didukung, jalankan perintah berikut ini di Cloud Shell:

az webapp list-runtimes --os linux | grep DOTNET

Setel versi .NET Core

Setel kerangka kerja target dalam file proyek untuk proyek ASP.NET Core Anda. Untuk informasi selengkapnya, lihat Memilih versi .NET Core untuk digunakan dalam dokumentasi .NET Core.

Jalankan perintah berikut ini di Cloud Shell untuk menyetel versi .NET Core ke 3.1:

az webapp config set --name <app-name> --resource-group <resource-group-name> --linux-fx-version "DOTNETCORE|3.1"

Menyesuaikan otomatisasi build

Jika Anda menyebarkan aplikasi menggunakan Git, atau paket zip dengan otomatisasi build diaktifkan, langkah-langkah otomatisasi build App Service melalui urutan berikut:

  1. Menjalankan skrip kustom jika ditentukan oleh PRE_BUILD_SCRIPT_PATH.
  2. Menjalankan dotnet restore untuk memulihkan dependensi NuGet.
  3. Menjalankan dotnet publish untuk membangun biner untuk produksi.
  4. Menjalankan skrip kustom jika ditentukan oleh POST_BUILD_SCRIPT_PATH.

PRE_BUILD_COMMAND dan POST_BUILD_COMMAND merupakan variabel lingkungan yang kosong secara default. Untuk menjalankan perintah pra-build, tentukan PRE_BUILD_COMMAND. Untuk menjalankan perintah pasca-build, tentukan POST_BUILD_COMMAND.

Contoh berikut menentukan dua variabel ke serangkaian perintah, yang dipisahkan oleh koma.

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"

Untuk variabel lingkungan lain untuk menyesuaikan otomatisasi build, lihat Konfigurasi Oryx.

Untuk informasi selengkapnya tentang cara menjalankan Azure App Service dan membangun aplikasi ASP.NET Core di Linux, lihat Dokumentasi Oryx: Bagaimana aplikasi .NET Core dideteksi dan dibangun.

Mengakses variabel lingkungan

Di Azure App Service, Anda dapat menyetel pengaturan aplikasi di luar kode aplikasi Anda. Kemudian Anda dapat mengaksesnya di kelas mana pun menggunakan pola injeksi dependensi ASP.NET Core:

using Microsoft.Extensions.Configuration;

namespace SomeNamespace 
{
    public class SomeClass
    {
        private IConfiguration _configuration;
    
        public SomeClass(IConfiguration configuration)
        {
            _configuration = configuration;
        }
    
        public SomeMethod()
        {
            // retrieve nested App Service app setting
            var myHierarchicalConfig = _configuration["My:Hierarchical:Config:Data"];
            // retrieve App Service connection string
            var myConnString = _configuration.GetConnectionString("MyDbConnection");
        }
    }
}

Jika Anda mengonfigurasi pengaturan aplikasi dengan nama yang sama di Azure App Service dan di appsettings.json, misalnya, nilai Azure App Service lebih diutamakan daripada nilai appsettings.json. Nilai appsettings.json lokal memungkinkan Anda men-debug aplikasi secara lokal, tetapi nilai App Service memungkinkan Anda menjalankan aplikasi dalam produksi dengan pengaturan produksi. String koneksi bekerja dengan cara yang sama. Dengan demikian, Anda dapat menyimpan rahasia aplikasi di luar repositori kode Anda dan mengakses nilai yang sesuai tanpa mengubah kode Anda.

Catatan

Perhatikan bahwa data konfigurasi hierarkis di appsettings.json diakses menggunakan pembatas __ (garis bawah ganda) yang merupakan standar di Linux ke .NET Core. Untuk mengambil alih pengaturan konfigurasi hierarkis tertentu di Azure App Service, atur nama pengaturan aplikasi dengan format pemisah yang sama dalam kunci. Anda dapat menjalankan contoh berikut ini di Cloud Shell:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings My__Hierarchical__Config__Data="some value"

Catatan

Perhatikan data konfigurasi hierarki di appsettings.json diakses menggunakan pemisah : yang standar untuk .NET Core. Untuk mengambil alih pengaturan konfigurasi hierarkis tertentu di Azure App Service, atur nama pengaturan aplikasi dengan format pemisah yang sama dalam kunci. Anda dapat menjalankan contoh berikut ini di Cloud Shell:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings My:Hierarchical:Config:Data="some value"

Menyebarkan solusi multi-proyek

Saat solusi Visual Studio menyertakan beberapa proyek, proses penerbitan Visual Studio sudah menyertakan pemilihan proyek untuk disebarkan. Saat Anda menyebarkan ke mesin penyebaran App Service, seperti Git, atau dengan penyebaran ZIP dengan otomatisasi build diaktifkan, mesin penyebaran App Service memilih Situs Web atau Proyek Aplikasi Web pertama yang ditemukannya sebagai aplikasi App Service. Anda dapat menentukan proyek mana yang harus digunakan Azure App Service dengan menentukan PROJECT pengaturan aplikasi. Misalnya, jalankan perintah berikut di Cloud Shell:

az webapp config appsettings set --resource-group <resource-group-name> --name <app-name> --settings PROJECT="<project-name>/<project-name>.csproj"

Mengakses log diagnostik

ASP.NET Core menyediakan penyedia pencatatan log bawaan untuk Azure App Service. Di Program.cs proyek Anda, tambahkan penyedia ke aplikasi Anda melalui ConfigureLogging metode ekstensi, seperti yang ditunjukkan dalam contoh berikut:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.AddAzureWebAppDiagnostics();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Anda kemudian dapat mengonfigurasi dan menghasilkan log dengan pola .NET Core standar.

Untuk mengakses log konsol yang dihasilkan dari dalam kode aplikasi Anda di App Service, aktifkan pembuatan log diagnostik dengan menjalankan perintah berikut di Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Nilai yang mungkin untuk --level adalah: Error, Warning, Info, dan Verbose. Setiap level berikutnya mencakup level sebelumnya. Misalnya: Error hanya menyertakan pesan kesalahan, dan Verbose menyertakan semua pesan.

Setelah pembuatan log diagnostik diaktifkan, jalankan perintah berikut untuk melihat aliran log:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Jika Anda tidak segera melihat log konsol, periksa lagi dalam 30 detik.

Catatan

Anda juga dapat memeriksa file log dari browser di https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Untuk menghentikan streaming log kapan saja, ketikkan Ctrl+C.

Untuk informasi selengkapnya tentang pemecahan masalah aplikasi ASP.NET Core di Azure App Service, lihat Memecahkan masalah ASP.NET Core di Azure App Service dan IIS

Dapatkan halaman pengecualian terperinci

Saat aplikasi ASP.NET Core Anda membuat pengecualian di debugger Visual Studio, browser menampilkan halaman detail pengecualian, tetapi di App Service, halaman tersebut digantikan oleh kesalahan HTTP 500 umum atau pesan Kesalahan terjadi saat memproses permintaan Anda. Untuk menampilkan halaman pengecualian terperinci di Azure App Service, Tambahkan ASPNETCORE_ENVIRONMENT pengaturan aplikasi ke aplikasi Anda dengan menjalankan perintah berikut di Cloud Shell.

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings ASPNETCORE_ENVIRONMENT="Development"

Mendeteksi sesi HTTPS

Dalam App Service, penghentian TLS/SSL terjadi pada load balancer jaringan, sehingga semua permintaan HTTPS mencapai aplikasi Anda sebagai permintaan HTTP yang tidak terenkripsi. Jika logika aplikasi Anda perlu mengetahui apakah permintaan pengguna dienkripsi atau tidak, konfigurasikan Middleware Header yang Diteruskan di Startup.cs:

  • Mengonfigurasi middleware dengan ForwardedHeadersOptions untuk meneruskan header X-Forwarded-For dan X-Forwarded-Proto di Startup.ConfigureServices.
  • Tambahkan rentang alamat IP pribadi ke jaringan yang dikenal, sehingga middleware dapat mempercayai penyeimbang beban Azure App Service.
  • Gunakan metode UseForwardedHeaders di Startup.Configure sebelum memanggil middleware lainnya.

Dengan menyatukan ketiga elemen, kode Anda akan terlihat seperti contoh berikut:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders =
            ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        // These three subnets encapsulate the applicable Azure subnets. At the moment, it's not possible to narrow it down further.
        options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:10.0.0.0"), 104));
        options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:192.168.0.0"), 112));
        options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:172.16.0.0"), 108));
    });
}

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

    ...

    app.UseMvc();
}

Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core untuk bekerja dengan server proxy dan memuat penyeimbang.

Membuka sesi SSH di browser

Untuk membuka sesi SSH langsung dengan kontainer Anda, aplikasi Anda harus berjalan.

Tempelkan URL berikut ke browser Anda dan ganti <app-name> dengan nama aplikasi Anda:

https://<app-name>.scm.azurewebsites.net/webssh/host

Jika belum diautentikasi, Anda harus mengautentikasi dengan langganan Azure untuk menyambungkan. Setelah diautentikasi, Anda akan melihat shell dalam browser, tempat Anda dapat menjalankan perintah di dalam kontainer Anda.

Koneksi SSH

Catatan

Setiap perubahan yang Anda buat di luar direktori /home disimpan dalam kontainer itu sendiri dan hanya ada saat aplikasi dihidupkan ulang.

Untuk membuka sesi SSH jarak jauh dari komputer lokal Anda, lihat Membuka sesi SSH dari shell jarak jauh.

robot933456 dalam log

Anda mungkin melihat pesan berikut dalam log kontainer:

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

Anda dapat mengabaikan pesan ini dengan aman. /robots933456.txt adalah jalur URL dummy yang digunakan App Service untuk memeriksa apakah kontainer mampu melayani permintaan. Respons 404 hanya menunjukkan bahwa jalur tersebut tidak ada, tetapi ini memberi tahu App Service bahwa kontainernya sehat dan siap untuk menanggapi permintaan.

Langkah berikutnya

Atau, lihat sumber daya lainnya:

Variabel lingkungan dan referensi pengaturan aplikasi