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 di Cloud Shell untuk mengatur versi .NET Core ke 8.0:
az webapp config set --name <app-name> --resource-group <resource-group-name> --linux-fx-version "DOTNETCORE|8.0"
Mengkustomisasi otomatisasi build
Catatan
Membangun aplikasi .NET 9 (STS) dengan Windows App Service menggunakan MSBuild atau SCM_DO_BUILD belum didukung. Dukungan untuk skenario build ini akan datang setelah tanggal GA awal dan pada 4 Desember 2024. Penyebaran yang dibangun di luar App Service melalui Visual Studio, Visual Studio Code, GitHub Actions, dan Azure DevOps didukung sepenuhnya.
Jika Anda menyebarkan aplikasi menggunakan Git, atau paket zip dengan otomatisasi build diaktifkan, langkah-langkah automasi build App Service akan melalui urutan berikut:
- Menjalankan skrip kustom jika ditentukan oleh
PRE_BUILD_SCRIPT_PATH
. - Menjalankan
dotnet restore
untuk memulihkan dependensi NuGet. - Menjalankan
dotnet publish
untuk membangun biner untuk produksi. - 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 bawaan, 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 App Service, Anda dapat menyetel pengaturan aplikasi di luar kode aplikasi. 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
Pertimbangkan opsi konektivitas yang lebih aman yang tidak memerlukan rahasia koneksi. Untuk informasi selengkapnya, lihat Mengamankan konektivitas ke layanan dan database Azure dari Azure App Service.
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 dengan 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 menghasilkan pengecualian di debugger Visual Studio, browser menampilkan halaman pengecualian terperinci, tetapi di App Service halaman tersebut digantikan oleh HTTP 500 generik atau Terjadi kesalahan saat memproses permintaan Anda. Untuk menampilkan halaman pengecualian terperinci di 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
danX-Forwarded-Proto
diStartup.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.
Menulis ulang atau mengalihkan URL
Untuk menulis ulang atau mengalihkan URL, gunakan middleware penulisan ulang URL di ASP.NET Core.
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.
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: