Implementasi server web di ASP.NET Core

Oleh Tom Dykstra, Steve Smith, Stephen Halter, dan Chris Ross

Aplikasi ASP.NET Core berjalan dengan implementasi server HTTP dalam proses. Implementasi server mendengarkan permintaan HTTP dan menampilkannya ke aplikasi sebagai kumpulan fitur permintaan yang disusun menjadi HttpContext.

ASP.NET Core dikirimkan dengan berikut ini:

Saat menggunakan IIS atau IIS Express, aplikasi akan berjalan:

ASP.NET Core Module adalah modul IIS native yang menangani permintaan IIS native antara IIS dan Server HTTP IIS dalam proses atau Kestrel. Untuk informasi lebih lanjut, lihat ASP.NET Core Module (ANCM) untuk IIS.

Kestrel vs. HTTP.sys

Kestrel memiliki keunggulan berikut jika dibandingkan dengan HTTP.sys:

  • Performa dan pemanfaatan memori yang lebih baik.
  • Platform silang
  • Kelincahan, ini dikembangkan dan di-patch secara independen dari OS.
  • Port dan konfigurasi TLS terprogram
  • Ekstensibilitas yang memungkinkan protokol seperti PPv2 dan transportasi alternatif.

Http.Sys beroperasi sebagai komponen mode kernel bersama dengan fitur berikut yang tidak dimiliki kestrel:

Model Hosting

Beberapa model hosting tersedia:

  • Kestrel hosting mandiri: Server Kestrel web berjalan tanpa memerlukan server web eksternal lainnya seperti IIS atau HTTP.sys.

  • Hosting mandiri HTTP.sys adalah alternatif untuk Kestrel. Kestrel disarankan melalui HTTP.sys kecuali aplikasi memerlukan fitur yang tidak tersedia di Kestrel.

  • Hosting dalam proses IIS: Aplikasi ASP.NET Core berjalan dalam proses yang sama dengan proses pekerja IIS-nya. Hosting dalam proses IIS memberikan peningkatan performa melalui hosting IIS di luar proses karena permintaan tidak diproksi melalui adaptor loopback, antarmuka jaringan yang mengembalikan lalu lintas jaringan keluar kembali ke komputer yang sama. IIS menangani manajemen proses dengan Windows Process Activation Service (WAS).

  • Hosting IIS di luar proses: aplikasi ASP.NET Core berjalan dalam proses yang terpisah dari proses pekerja IIS, dan modul menangani manajemen proses. Modul memulai proses untuk aplikasi ASP.NET Core ketika permintaan pertama tiba dan memulai ulang aplikasi jika aplikasi dimatikan atau mengalami crash. Ini pada dasarnya merupakan perilaku yang sama seperti yang terlihat pada aplikasi yang berjalan dalam proses yang dikelola oleh Windows Process Activation Service (WAS). Menggunakan proses terpisah juga memungkinkan hosting lebih dari satu aplikasi dari kumpulan aplikasi yang sama.

Untuk mengetahui informasi selengkapnya, lihat tautan berikut:

Kestrel

Server Kestrel adalah implementasi server HTTP lintas platform default. Kestrel memberikan performa dan penggunaan memori terbaik, tetapi tidak memiliki beberapa fitur lanjutan di HTTP.sys. Untuk informasi lebih lanjut, lihat Kestrel vs. HTTP.sys dalam dokumen ini.

Gunakan Kestrel:

  • Sendiri, sebagai permintaan pemrosesan server tepi langsung dari jaringan, termasuk internet.

    Kestrel communicates directly with the Internet without a reverse proxy server

  • Dengan server proksi terbalik, seperti Layanan Informasi Internet (IIS), Nginx, atau Apache. Server proksi terbalik menerima permintaan HTTP dari Internet dan meneruskannya ke Kestrel.

    Kestrel communicates indirectly with the Internet through a reverse proxy server, such as IIS, Nginx, or Apache

Konfigurasi hosting—dengan atau tanpa server proksi terbalik—didukung.

Untuk Kestrel panduan konfigurasi dan informasi tentang kapan harus digunakan Kestrel dalam konfigurasi proksi terbalik, lihat Kestrel server web di ASP.NET Core.

ASP.NET Core dikirimkan dengan berikut ini:

Saat menggunakan IIS atau IIS Express, aplikasi berjalan dalam proses yang terpisah dari proses pekerja IIS (di luar proses) dengan server Kestrel.

Karena aplikasi ASP.NET Core berjalan dalam proses yang terpisah dari proses pekerja IIS, modul menangani manajemen proses. Modul memulai proses untuk aplikasi ASP.NET Core ketika permintaan pertama tiba dan memulai ulang aplikasi jika aplikasi dimatikan atau mengalami crash. Ini pada dasarnya merupakan perilaku yang sama seperti yang terlihat pada aplikasi yang berjalan dalam proses yang dikelola oleh Windows Process Activation Service (WAS).

Diagram berikut mengilustrasikan hubungan antara IIS, ASP.NET Core Module, dan aplikasi yang dihosting di luar proses:

ASP.NET Core Module

Permintaan datang dari web ke driver HTTP.sys mode kernel. Driver merutekan permintaan ke IIS pada port situs web yang dikonfigurasi, biasanya 80 (HTTP) atau 443 (HTTPS). Modul meneruskan permintaan ke Kestrel pada port acak untuk aplikasi, yang bukan port 80 atau 443.

Modul menentukan port melalui variabel lingkungan saat startup, dan Middleware Integrasi IIS mengonfigurasi server yang akan didengarkan di http://localhost:{port}. Pemeriksaan tambahan dilakukan, dan permintaan yang tidak berasal dari modul ditolak. Modul tidak mendukung penerusan HTTPS, jadi permintaan diteruskan melalui HTTP meskipun diterima oleh IIS melalui HTTPS.

Setelah Kestrel mengambil permintaan dari modul, permintaan didorong ke dalam alur middleware ASP.NET Core. Alur middleware menangani permintaan dan meneruskannya sebagai instans HttpContext ke logika aplikasi. Middleware yang ditambahkan oleh Integrasi IIS memperbarui skema, IP jarak jauh, dan basis jalur ke akun untuk meneruskan permintaan ke Kestrel. Respons aplikasi diteruskan kembali ke IIS, yang mendorongnya kembali ke klien HTTP yang menginisiasi permintaan.

Untuk panduan konfigurasi IIS dan ASP.NET Core Module, lihat topik berikut:

Nginx dengan Kestrel

Untuk informasi tentang cara menggunakan Nginx di Linux sebagai server proksi terbalik untuk Kestrel, lihat Menghosting ASP.NET Core di Linux dengan Nginx.

Apache dengan Kestrel

Untuk informasi tentang cara menggunakan Apache di Linux sebagai server proksi terbalik untuk Kestrel, lihat Menghosting ASP.NET Core di Linux dengan Apache.

HTTP.sys

Jika aplikasi ASP.NET Core dijalankan di Windows, HTTP.sys adalah alternatif untuk Kestrel. Kestrel disarankan melalui HTTP.sys kecuali aplikasi memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi lebih lanjut, lihat implementasi server web HTTP.sys di ASP.NET Core.

HTTP.sys communicates directly with the Internet

HTTP.sys juga dapat digunakan untuk aplikasi yang hanya terekspos ke jaringan internal.

HTTP.sys communicates directly with the internal network

Untuk panduan konfigurasi HTTP.sys, lihat Implementasi server web HTTP.sys di ASP.NET Core.

Infrastruktur server ASP.NET Core

IApplicationBuilder yang tersedia dalam metode Startup.Configure mengekspos properti ServerFeatures dari jenis IFeatureCollection. Masing-masing dari Kestrel dan HTTP.sys hanya mengekspos satu fitur, IServerAddressesFeature, tetapi implementasi server yang berbeda dapat mengekspos fungsionalitas tambahan.

IServerAddressesFeature dapat digunakan untuk mengetahui port mana yang terikat pada implementasi server saat runtime bahasa umum.

Server kustom

Jika server bawaan tidak memenuhi persyaratan aplikasi, implementasi server kustom dapat dibuat. Panduan Open Web Interface for .NET (OWIN) menunjukkan cara menulis implementasi IServer berbasis Nowin. Hanya antarmuka fitur yang digunakan aplikasi yang memerlukan implementasi, meski setidaknya IHttpRequestFeature dan IHttpResponseFeature harus didukung.

Startup server

Server diluncurkan ketika Integrated Development Environment (IDE) atau penyunting memulai aplikasi:

Saat meluncurkan aplikasi dari perintah di folder proyek, dotnet run meluncurkan aplikasi dan server (Kestrel dan HTTP.sys saja). Konfigurasi ditentukan oleh opsi -c|--configuration, yang diatur ke Debug (default) atau Release.

File launchSettings.json menyediakan konfigurasi saat meluncurkan aplikasi dengan dotnet run atau dengan debugger yang ada di dalam alat, seperti Visual Studio. Jika profil peluncuran ada dalam file launchSettings.json, gunakan opsi --launch-profile {PROFILE NAME} dengan perintah dotnet run atau pilih profil di Visual Studio. Untuk informasi lebih lanjut, lihat dotnet run dan pengemasan distribusi .NET Core.

Dukungan HTTP/2

HTTP/2 didukung dengan ASP.NET Core dalam skenario penyebaran berikut:

  • Kestrel
    • Sistem operasi
      • Windows Server 2016/Windows 10 atau yang lebih baru†
      • Linux dengan OpenSSL 1.0.2 atau yang lebih baru (misalnya, Ubuntu 16.04 atau yang lebih baru)
      • macOS 10.15 atau yang lebih baru
    • Kerangka kerja target: .NET Core 2.2 atau yang lebih baru
  • HTTP.sys
    • Windows Server 2016/Windows 10 atau yang lebih baru
    • Kerangka kerja target: Tidak berlaku untuk penyebaran HTTP.sys.
  • IIS (dalam proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Kerangka kerja target: .NET Core 2.2 atau yang lebih baru
  • IIS (di luar proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Koneksi server tepi yang menghadap publik menggunakan HTTP/2, tetapi koneksi proksi terbalik ke Kestrel menggunakan HTTP/1.1.
    • Kerangka kerja target: Tidak berlaku untuk penyebaran di luar proses IIS.

†Kestrel memiliki dukungan terbatas untuk HTTP/2 di Windows Server 2012 R2 dan Windows 8.1. Dukungan terbatas karena daftar rangkaian cipher TLS yang didukung yang tersedia pada sistem operasi ini terbatas. Sertifikat yang dihasilkan menggunakan Elliptic Curve Digital Signature Algorithm (ECDSA) mungkin diperlukan untuk mengamankan koneksi TLS.

  • Kestrel
    • Sistem operasi
      • Windows Server 2016/Windows 10 atau yang lebih baru†
      • Linux dengan OpenSSL 1.0.2 atau yang lebih baru (misalnya, Ubuntu 16.04 atau yang lebih baru)
      • HTTP/2 akan didukung di macOS dalam rilis mendatang.
    • Kerangka kerja target: .NET Core 2.2 atau yang lebih baru
  • HTTP.sys
    • Windows Server 2016/Windows 10 atau yang lebih baru
    • Kerangka kerja target: Tidak berlaku untuk penyebaran HTTP.sys.
  • IIS (dalam proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Kerangka kerja target: .NET Core 2.2 atau yang lebih baru
  • IIS (di luar proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Koneksi server tepi yang menghadap publik menggunakan HTTP/2, tetapi koneksi proksi terbalik ke Kestrel menggunakan HTTP/1.1.
    • Kerangka kerja target: Tidak berlaku untuk penyebaran di luar proses IIS.

†Kestrel memiliki dukungan terbatas untuk HTTP/2 di Windows Server 2012 R2 dan Windows 8.1. Dukungan terbatas karena daftar rangkaian cipher TLS yang didukung yang tersedia pada sistem operasi ini terbatas. Sertifikat yang dihasilkan menggunakan Elliptic Curve Digital Signature Algorithm (ECDSA) mungkin diperlukan untuk mengamankan koneksi TLS.

  • Kestrel
    • Sistem operasi
      • Windows Server 2016/Windows 10 atau yang lebih baru†
      • Linux dengan OpenSSL 1.0.2 atau yang lebih baru (misalnya, Ubuntu 16.04 atau yang lebih baru)
      • HTTP/2 akan didukung di macOS dalam rilis mendatang.
    • Kerangka kerja target: .NET Core 2.2 atau yang lebih baru
  • HTTP.sys
    • Windows Server 2016/Windows 10 atau yang lebih baru
    • Kerangka kerja target: Tidak berlaku untuk penyebaran HTTP.sys.
  • IIS (dalam proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Kerangka kerja target: .NET Core 2.2 atau yang lebih baru
  • IIS (di luar proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Koneksi server tepi yang menghadap publik menggunakan HTTP/2, tetapi koneksi proksi terbalik ke Kestrel menggunakan HTTP/1.1.
    • Kerangka kerja target: Tidak berlaku untuk penyebaran di luar proses IIS.

†Kestrel memiliki dukungan terbatas untuk HTTP/2 di Windows Server 2012 R2 dan Windows 8.1. Dukungan terbatas karena daftar rangkaian cipher TLS yang didukung yang tersedia pada sistem operasi ini terbatas. Sertifikat yang dihasilkan menggunakan Elliptic Curve Digital Signature Algorithm (ECDSA) mungkin diperlukan untuk mengamankan koneksi TLS.

  • HTTP.sys
    • Windows Server 2016/Windows 10 atau yang lebih baru
    • Kerangka kerja target: Tidak berlaku untuk penyebaran HTTP.sys.
  • IIS (di luar proses)
    • Windows Server 2016/Windows 10 atau yang lebih baru; IIS 10 atau yang lebih baru
    • Koneksi server tepi yang menghadap publik menggunakan HTTP/2, tetapi koneksi proksi terbalik ke Kestrel menggunakan HTTP/1.1.
    • Kerangka kerja target: Tidak berlaku untuk penyebaran di luar proses IIS.

Sambungan HTTP/2 harus menggunakan Application-Layer Protocol Negotiation (ALPN) dan TLS 1.2 atau yang lebih baru. Untuk informasi lebih lanjut, lihat topik yang berkaitan dengan skenario penyebaran server Anda.

Sumber Daya Tambahan: