Implementasi server web HTTP.sys di ASP.NET Core
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Oleh Tom Dykstra dan Chris Ross
HTTP.sys adalah server web untuk ASP.NET Core yang hanya berjalan di Windows. HTTP.sys adalah alternatif untuk Kestrel server dan menawarkan beberapa fitur yang Kestrel tidak disediakan.
Penting
HTTP.sys tidak kompatibel dengan Modul Inti ASP.NET dan tidak dapat digunakan dengan IIS atau IIS Express.
HTTP.sys mendukung fitur-fitur berikut:
- Autentikasi Windows
- Berbagi port
- HTTPS dengan SNI
- HTTP/2 melalui TLS (Windows 10 atau yang lebih baru)
- Transmisi file langsung
- Pembuatan cache respons
- WebSockets (Windows 8 atau yang lebih baru)
Versi Windows yang didukung:
- Windows 7 atau yang lebih baru
- Windows Server 2008 R2 atau yang lebih baru
Melihat atau mengunduh kode sampel (cara mengunduh)
Kapan menggunakan HTTP.sys
HTTP.sys berguna untuk penyebaran di mana:
Ada kebutuhan untuk mengekspos server langsung ke Internet tanpa menggunakan IIS.
Penyebaran internal memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi selengkapnya, lihat Kestrel vs. HTTP.sys
HTTP.sys adalah teknologi matang yang melindungi dari banyak jenis serangan dan memberikan ketahanan, keamanan, dan skalabilitas server web berfokus penuh. IIS sendiri berjalan sebagai pendengar HTTP di atas HTTP.sys.
Dukungan HTTP/2
HTTP/2 diaktifkan untuk aplikasi ASP.NET Core saat persyaratan dasar berikut terpenuhi:
- Windows Server 2016/Windows 10 atau yang lebih baru
- Koneksi Negosiasi Protokol Lapisan Aplikasi (ALPN)
- TLS 1.2 atau koneksi yang lebih baru
Jika koneksi HTTP/2 dibuat, HttpRequest.Protocol melaporkan HTTP/2
.
HTTP/2 diaktifkan secara default. Jika koneksi HTTP/2 tidak dibuat, koneksi akan kembali ke HTTP/1.1. Dalam rilis Windows di masa mendatang, bendera konfigurasi HTTP/2 akan tersedia, termasuk kemampuan untuk menonaktifkan HTTP/2 dengan HTTP.sys.
Dukungan HTTP/3
HTTP/3 diaktifkan untuk aplikasi ASP.NET Core saat persyaratan dasar berikut terpenuhi:
- Windows Server 2022/Windows 11 atau yang lebih baru
- Pengikatan
https
url digunakan. - Kunci registri EnableHttp3 diatur.
Versi Build Windows 11 sebelumnya mungkin memerlukan penggunaan build Windows Insider .
HTTP/3 ditemukan sebagai peningkatan dari HTTP/1.1 atau HTTP/2 melalui alt-svc
header. Itu berarti permintaan pertama biasanya akan menggunakan HTTP/1.1 atau HTTP/2 sebelum beralih ke HTTP/3. Http.Sys tidak secara otomatis menambahkan alt-svc
header, itu harus ditambahkan oleh aplikasi. Kode berikut adalah contoh middleware yang menambahkan alt-svc
header respons.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Tempatkan kode sebelumnya di awal alur permintaan.
Http.Sys juga mendukung pengiriman pesan protokol HTTP/2 AltSvc daripada header respons untuk memberi tahu klien bahwa HTTP/3 tersedia. Lihat kunci registri EnableAltSvc. Ini memerlukan pengikatan sslcert netsh yang menggunakan nama host daripada alamat IP.
Autentikasi mode kernel dengan Kerberos
HTTP.sys mendelegasikan ke autentikasi mode kernel dengan protokol autentikasi Kerberos. Autentikasi mode pengguna tidak didukung dengan Kerberos dan HTTP.sys. Akun komputer harus digunakan untuk mendekripsi token/tiket Kerberos yang diperoleh dari Direktori Aktif dan diteruskan oleh klien ke server untuk mengautentikasi pengguna. Daftarkan Nama Perwakilan Layanan (SPN) untuk host, bukan pengguna aplikasi.
Dukungan untuk buffering respons mode kernel
Dalam beberapa skenario, volume tinggi penulisan kecil dengan latensi tinggi dapat menyebabkan dampak performa yang signifikan ke HTTP.sys
. Dampak ini disebabkan oleh kurangnya Pipe buffer dalam HTTP.sys
implementasi. Untuk meningkatkan performa dalam skenario ini, dukungan untuk buffering respons disertakan dalam HTTP.sys
. Aktifkan buffering dengan mengatur HttpSysOptions.EnableKernelResponseBuffering ke true
.
Buffering respons harus diaktifkan oleh aplikasi yang melakukan I/O sinkron, atau I/O asinkron dengan tidak lebih dari satu tulisan yang luar biasa pada satu waktu. Dalam skenario ini, buffering respons dapat secara signifikan meningkatkan throughput melalui koneksi latensi tinggi.
Aplikasi yang menggunakan I/O asinkron dan yang mungkin memiliki lebih dari satu tulisan terutang sekaligus tidak boleh menggunakan bendera ini. Mengaktifkan bendera ini dapat mengakibatkan penggunaan CPU dan memori yang lebih tinggi oleh HTTP.Sys.
Cara menggunakan HTTP.sys
Mengonfigurasi aplikasi ASP.NET Core untuk menggunakan HTTP.sys
UseHttpSys Panggil metode ekstensi saat membangun host, menentukan apa pun yang diperlukan HttpSysOptions. Contoh berikut mengatur opsi ke nilai defaultnya:
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30_000_000;
options.UrlPrefixes.Add("http://localhost:5005");
});
builder.Services.AddRazorPages();
var app = builder.Build();
Konfigurasi HTTP.sys tambahan ditangani melalui pengaturan registri.
Untuk informasi selengkapnya tentang opsi HTTP.sys, lihat HttpSysOptions.
MaxRequestBodySize
Ukuran maksimum yang diizinkan dari isi permintaan apa pun dalam byte. Ketika diatur ke null
, ukuran isi permintaan maksimum tidak terbatas. Batas ini tidak berpengaruh pada koneksi yang ditingkatkan, yang selalu tidak terbatas.
Metode yang disarankan untuk mengambil alih batas dalam aplikasi ASP.NET Core MVC untuk satu IActionResult
adalah dengan menggunakan RequestSizeLimitAttribute atribut pada metode tindakan:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pengecualian dilemparkan jika aplikasi mencoba mengonfigurasi batas permintaan setelah aplikasi mulai membaca permintaan. Properti IsReadOnly
dapat digunakan untuk menunjukkan apakah MaxRequestBodySize
properti dalam status baca-saja, yang berarti terlambat untuk mengonfigurasi batas.
Jika aplikasi harus mengambil MaxRequestBodySize alih per permintaan, gunakan IHttpMaxRequestBodySizeFeature:
app.Use((context, next) =>
{
context.Features.GetRequiredFeature<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var server = context.RequestServices
.GetRequiredService<IServer>();
var serverAddressesFeature = server.Features
.GetRequiredFeature<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature.Addresses);
var loggerFactory = context.RequestServices
.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
logger.LogInformation("Addresses: {addresses}", addresses);
return next(context);
});
Jika menggunakan Visual Studio, pastikan aplikasi tidak dikonfigurasi untuk menjalankan IIS atau IIS Express.
Di Visual Studio, profil peluncuran default adalah untuk IIS Express. Untuk menjalankan proyek sebagai aplikasi konsol, ubah profil yang dipilih secara manual, seperti yang ditunjukkan pada cuplikan layar berikut:
Mengonfigurasi Windows Server
Tentukan port yang akan dibuka untuk aplikasi dan gunakan Windows Firewall atau cmdlet PowerShell New-NetFirewallRule untuk membuka port firewall agar lalu lintas dapat mencapai HTTP.sys. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.
Saat menyebarkan ke Azure VM, buka port di Grup Keamanan Jaringan. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.
Dapatkan dan instal sertifikat X.509, jika diperlukan.
Di Windows, buat sertifikat yang ditandatangani sendiri menggunakan cmdlet PowerShell New-SelfSignedCertificate. Untuk contoh yang tidak didukung, lihat UpdateIISExpressSSLForChrome.ps1.
Instal sertifikat yang ditandatangani sendiri atau ditandatangani CA di penyimpanan Pribadi Komputer>Lokal server.
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET Core, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET Core yang menargetkan .NET Framework).
- .NET Core: Jika aplikasi memerlukan .NET Core, dapatkan dan jalankan penginstal .NET Core Runtime dari .NET Core Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Alat penginstal untuk .NET Framework terbaru tersedia dari halaman .NET Core Downloads .
Jika aplikasi adalah penyebaran mandiri, aplikasi menyertakan runtime dalam penyebarannya. Tidak ada penginstalan kerangka kerja yang diperlukan pada server.
Konfigurasikan URL dan port di aplikasi.
Secara default, ASP.NET Core mengikat ke
http://localhost:5000
. Untuk mengonfigurasi awalan URL dan port, opsi meliputi:- UseUrls
urls
argumen baris perintahASPNETCORE_URLS
Variabel lingkungan- UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4
IP lokal server pada port 443:var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); builder.Services.AddRazorPages(); var app = builder.Build();
Keuntungannya
UrlPrefixes
adalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixes
mengesampingkanASPNETCORE_URLS
UseUrls
/urls
/pengaturan. Oleh karena itu, keuntungan dariUseUrls
, , danASPNETCORE_URLS
variabel lingkungan adalah lebih mudah untuk beralih antara Kestrel danurls
HTTP.sys.HTTP.sys mengenali dua jenis wild card dalam awalan URL:
*
adalah pengikatan yang lemah, juga dikenal sebagai pengikatan fallback. Jika awalan URL adalahhttp://*:5000
, dan sesuatu yang lain terikat ke port 5000, pengikatan ini tidak akan digunakan.+
adalah pengikatan yang kuat. Jika awalan URL adalahhttp://+:5000
, pengikatan ini akan digunakan sebelum pengikatan port 5000 lainnya.
Untuk informasi selengkapnya, lihat String UrlPrefix.
Peringatan
Pengikatan wildcard tingkat atas (
http://*:80/
danhttp://+:80
) tidak boleh digunakan. Pengikatan kartubebas tingkat atas menciptakan kerentanan keamanan aplikasi. Ini berlaku untuk wildcard kuat dan lemah. Gunakan nama host eksplisit atau alamat IP daripada kartubebas. Pengikatan wildcard subdomain (misalnya,*.mysub.com
) bukan risiko keamanan jika Anda mengontrol seluruh domain induk (*.com
dibandingkan dengan , yang rentan). Untuk informasi selengkapnya, lihat RFC 9110: Bagian 7.2: Host dan :authority.Aplikasi dan kontainer sering kali hanya diberikan port untuk didengarkan, seperti port 80, tanpa batasan tambahan seperti host atau jalur. HTTP_PORTS dan HTTPS_PORTS adalah kunci konfigurasi yang menentukan port mendengarkan untuk Kestrel server HTTP.sys dan . Kunci ini dapat ditentukan sebagai variabel lingkungan yang ditentukan dengan awalan
DOTNET_
atauASPNETCORE_
, atau ditentukan langsung melalui input konfigurasi lainnya, sepertiappsettings.json
. Masing-masing adalah daftar nilai port yang dibatasi titik koma, seperti yang ditunjukkan dalam contoh berikut:ASPNETCORE_HTTP_PORTS=80;8080 ASPNETCORE_HTTPS_PORTS=443;8081
Contoh sebelumnya adalah singkatan dari konfigurasi berikut, yang menentukan skema (HTTP atau HTTPS) dan host atau IP apa pun.
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
Kunci konfigurasi HTTP_PORTS dan HTTPS_PORTS berprioritas lebih rendah dan ditimpa oleh URL atau nilai yang disediakan langsung dalam kode. Sertifikat masih perlu dikonfigurasi secara terpisah melalui mekanisme khusus server untuk HTTPS.
Kunci konfigurasi ini setara dengan pengikatan kartubebas tingkat atas. Mereka nyaman untuk skenario pengembangan dan kontainer, tetapi hindari kartubebas saat berjalan di komputer yang juga dapat menghosting layanan lain.
Prefiks URL pra-pendaftaran di server.
Alat bawaan untuk mengonfigurasi HTTP.sys netsh.exe. netsh.exe digunakan untuk memesan awalan URL dan menetapkan sertifikat X.509. Alat ini memerlukan hak istimewa administrator.
Gunakan alat netsh.exe untuk mendaftarkan URL untuk aplikasi:
netsh http add urlacl url=<URL> user=<USER>
<URL>
: Pencari Sumber Daya Seragam (URL) yang sepenuhnya memenuhi syarat. Jangan gunakan pengikatan kartubebas. Gunakan nama host atau alamat IP lokal yang valid. URL harus menyertakan garis miring berikutnya.<USER>
: Menentukan nama pengguna atau grup pengguna.
Dalam contoh berikut, alamat IP lokal server adalah
10.0.0.4
:netsh http add urlacl url=https://10.0.0.4:443/ user=Users
Ketika URL terdaftar, alat merespons dengan
URL reservation successfully added
.Untuk menghapus URL terdaftar, gunakan
delete urlacl
perintah :netsh http delete urlacl url=<URL>
Daftarkan sertifikat X.509 di server.
Gunakan alat netsh.exe untuk mendaftarkan sertifikat untuk aplikasi:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
<IP>
: Menentukan alamat IP lokal untuk pengikatan. Jangan gunakan pengikatan kartubebas. Gunakan alamat IP yang valid.<PORT>
: Menentukan port untuk pengikatan.<THUMBPRINT>
: Thumbprint sertifikat X.509.<GUID>
: GUID yang dihasilkan pengembang untuk mewakili aplikasi untuk tujuan informasi.
Untuk tujuan referensi, simpan GUID di aplikasi sebagai tag paket:
- Di Visual Studio:
- Buka properti proyek aplikasi dengan mengklik kanan aplikasi di Penjelajah Solusi dan memilih Properti.
- Pilih tab Paket .
- Masukkan GUID yang Anda buat di bidang Tag .
- Saat tidak menggunakan Visual Studio:
Buka file proyek aplikasi.
<PackageTags>
Tambahkan properti ke baru atau yang sudah<PropertyGroup>
ada dengan GUID yang Anda buat:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
Dalam contoh berikut:
- Alamat IP lokal server adalah
10.0.0.4
. - Generator GUID acak online memberikan nilainya
appid
.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
Ketika sertifikat terdaftar, alat merespons dengan
SSL Certificate successfully added
.Untuk menghapus pendaftaran sertifikat, gunakan
delete sslcert
perintah :netsh http delete sslcert ipport=<IP>:<PORT>
Dokumentasi referensi untuk netsh.exe:
Jalankan aplikasi.
Hak istimewa administrator tidak diperlukan untuk menjalankan aplikasi saat mengikat ke localhost menggunakan HTTP (bukan HTTPS) dengan nomor port yang lebih besar dari 1024. Untuk konfigurasi lain (misalnya, menggunakan alamat IP lokal atau pengikatan ke port 443), jalankan aplikasi dengan hak istimewa administrator.
Aplikasi merespons di alamat IP publik server. Dalam contoh ini, server dicapai dari Internet di alamat IP publiknya.
104.214.79.47
Sertifikat pengembangan digunakan dalam contoh ini. Halaman dimuat dengan aman setelah melewati peringatan sertifikat browser yang tidak tepercaya.
Skenario server proksi dan penyeimbang beban
Untuk aplikasi yang dihosting oleh HTTP.sys yang berinteraksi dengan permintaan dari Internet atau jaringan perusahaan, konfigurasi tambahan mungkin diperlukan saat menghosting di belakang server proksi dan load balancer. Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core untuk bekerja dengan server proxy dan memuat penyeimbang.
Dapatkan informasi waktu terperinci dengan IHttpSysRequestTimingFeature
IHttpSysRequestTimingFeature menyediakan informasi waktu terperinci untuk permintaan:
- Tanda waktu diperoleh menggunakan QueryPerformanceCounter.
- Frekuensi tanda waktu dapat diperoleh melalui QueryPerformanceFrequency.
- Indeks waktu dapat ditransmisikan ke HttpSysRequestTimingType untuk mengetahui apa yang diwakili oleh waktu.
- Nilainya mungkin 0 jika waktu tidak tersedia untuk permintaan saat ini.
- Memerlukan Windows 10 versi 2004, Windows Server 2022, atau yang lebih baru.
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timestamps = feature.Timestamps;
for (var i = 0; i < timestamps.Length; i++)
{
var timestamp = timestamps[i];
var timingType = (HttpSysRequestTimingType)i;
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
IHttpSysRequestTimingFeature.TryGetTimestamp mengambil tanda waktu untuk jenis waktu yang disediakan:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetTimestamp(timingType, out var timestamp))
{
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
else
{
logger.LogInformation("Timestamp {timingType}: not available for the "
+ "current request", timingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
IHttpSysRequestTimingFeature.TryGetElapsedTime memberikan waktu yang berlalu antara dua waktu yang ditentukan:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var startingTimingType = HttpSysRequestTimingType.RequestRoutingStart;
var endingTimingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetElapsedTime(startingTimingType, endingTimingType, out var elapsed))
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}: {elapsed}",
startingTimingType,
endingTimingType,
elapsed);
}
else
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}:"
+ " not available for the current request.",
startingTimingType,
endingTimingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
Fitur HTTP/2 tingkat lanjut untuk mendukung gRPC
Fitur HTTP/2 tambahan dalam HTTP.sys mendukung gRPC, termasuk dukungan untuk trailer respons dan mengirim bingkai reset.
Persyaratan untuk menjalankan gRPC dengan HTTP.sys:
- Windows 11 Build 22000 atau yang lebih baru, Windows Server 2022 Build 20348 atau yang lebih baru.
- Koneksi TLS 1.2 atau yang lebih baru.
Trailer
Http Trailer mirip dengan Header HTTP, kecuali dikirim setelah isi respons dikirim. Untuk IIS dan HTTP.sys, hanya trailer respons HTTP/2 yang didukung.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Dalam kode contoh sebelumnya:
SupportsTrailers
memastikan bahwa trailer didukung untuk respons.DeclareTrailer
menambahkan nama trailer yang diberikan keTrailer
header respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailer
dipanggil, harus sebelum header respons dikirim.AppendTrailer
menambahkan trailer.
Reset
Reset memungkinkan server untuk mengatur ulang permintaan HTTP/2 dengan kode kesalahan tertentu. Permintaan reset dianggap dibatalkan.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
dalam contoh kode sebelumnya menentukan INTERNAL_ERROR
kode kesalahan. Untuk informasi selengkapnya tentang kode kesalahan HTTP/2, kunjungi bagian kode kesalahan spesifikasi HTTP/2.
Menelusuri
Untuk informasi tentang cara mendapatkan jejak dari HTTP.sys, lihat Skenario Pengelolaan HTTP.sys.
Sumber Daya Tambahan:
HTTP.sys adalah server web untuk ASP.NET Core yang hanya berjalan di Windows. HTTP.sys adalah alternatif untuk Kestrel server dan menawarkan beberapa fitur yang Kestrel tidak disediakan.
Penting
HTTP.sys tidak kompatibel dengan Modul Inti ASP.NET dan tidak dapat digunakan dengan IIS atau IIS Express.
HTTP.sys mendukung fitur-fitur berikut:
- Autentikasi Windows
- Berbagi port
- HTTPS dengan SNI
- HTTP/2 melalui TLS (Windows 10 atau yang lebih baru)
- Transmisi file langsung
- Pembuatan cache respons
- WebSockets (Windows 8 atau yang lebih baru)
Versi Windows yang didukung:
- Windows 7 atau yang lebih baru
- Windows Server 2008 R2 atau yang lebih baru
Melihat atau mengunduh kode sampel (cara mengunduh)
Kapan menggunakan HTTP.sys
HTTP.sys berguna untuk penyebaran di mana:
Ada kebutuhan untuk mengekspos server langsung ke Internet tanpa menggunakan IIS.
Penyebaran internal memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi selengkapnya, lihat Kestrel vs. HTTP.sys
HTTP.sys adalah teknologi matang yang melindungi dari banyak jenis serangan dan memberikan ketahanan, keamanan, dan skalabilitas server web berfokus penuh. IIS sendiri berjalan sebagai pendengar HTTP di atas HTTP.sys.
Dukungan HTTP/2
HTTP/2 diaktifkan untuk aplikasi ASP.NET Core saat persyaratan dasar berikut terpenuhi:
- Windows Server 2016/Windows 10 atau yang lebih baru
- Koneksi Negosiasi Protokol Lapisan Aplikasi (ALPN)
- TLS 1.2 atau koneksi yang lebih baru
Jika koneksi HTTP/2 dibuat, HttpRequest.Protocol melaporkan HTTP/2
.
HTTP/2 diaktifkan secara default. Jika koneksi HTTP/2 tidak dibuat, koneksi akan kembali ke HTTP/1.1. Dalam rilis Windows di masa mendatang, bendera konfigurasi HTTP/2 akan tersedia, termasuk kemampuan untuk menonaktifkan HTTP/2 dengan HTTP.sys.
Dukungan HTTP/3
HTTP/3 diaktifkan untuk aplikasi ASP.NET Core saat persyaratan dasar berikut terpenuhi:
- Windows Server 2022/Windows 11 atau yang lebih baru
- Pengikatan
https
url digunakan. - Kunci registri EnableHttp3 diatur.
Versi Build Windows 11 sebelumnya mungkin memerlukan penggunaan build Windows Insider .
HTTP/3 ditemukan sebagai peningkatan dari HTTP/1.1 atau HTTP/2 melalui alt-svc
header. Itu berarti permintaan pertama biasanya akan menggunakan HTTP/1.1 atau HTTP/2 sebelum beralih ke HTTP/3. Http.Sys tidak secara otomatis menambahkan alt-svc
header, itu harus ditambahkan oleh aplikasi. Kode berikut adalah contoh middleware yang menambahkan alt-svc
header respons.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Tempatkan kode sebelumnya di awal alur permintaan.
Http.Sys juga mendukung pengiriman pesan protokol HTTP/2 AltSvc daripada header respons untuk memberi tahu klien bahwa HTTP/3 tersedia. Lihat kunci registri EnableAltSvc. Ini memerlukan pengikatan sslcert netsh yang menggunakan nama host daripada alamat IP.
Autentikasi mode kernel dengan Kerberos
HTTP.sys mendelegasikan ke autentikasi mode kernel dengan protokol autentikasi Kerberos. Autentikasi mode pengguna tidak didukung dengan Kerberos dan HTTP.sys. Akun komputer harus digunakan untuk mendekripsi token/tiket Kerberos yang diperoleh dari Direktori Aktif dan diteruskan oleh klien ke server untuk mengautentikasi pengguna. Daftarkan Nama Perwakilan Layanan (SPN) untuk host, bukan pengguna aplikasi.
Cara menggunakan HTTP.sys
Mengonfigurasi aplikasi ASP.NET Core untuk menggunakan HTTP.sys
UseHttpSys Panggil metode ekstensi saat membangun host, menentukan apa pun yang diperlukan HttpSysOptions. Contoh berikut mengatur opsi ke nilai defaultnya:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
Konfigurasi HTTP.sys tambahan ditangani melalui pengaturan registri.
Untuk informasi selengkapnya tentang opsi HTTP.sys, lihat HttpSysOptions.
MaxRequestBodySize
Ukuran maksimum yang diizinkan dari isi permintaan apa pun dalam byte. Ketika diatur ke null
, ukuran isi permintaan maksimum tidak terbatas. Batas ini tidak berpengaruh pada koneksi yang ditingkatkan, yang selalu tidak terbatas.
Metode yang disarankan untuk mengambil alih batas dalam aplikasi ASP.NET Core MVC untuk satu IActionResult
adalah dengan menggunakan RequestSizeLimitAttribute atribut pada metode tindakan:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pengecualian dilemparkan jika aplikasi mencoba mengonfigurasi batas permintaan setelah aplikasi mulai membaca permintaan. Properti IsReadOnly
dapat digunakan untuk menunjukkan apakah MaxRequestBodySize
properti dalam status baca-saja, yang berarti terlambat untuk mengonfigurasi batas.
Jika aplikasi harus mengambil MaxRequestBodySize alih per permintaan, gunakan IHttpMaxRequestBodySizeFeature:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Jika menggunakan Visual Studio, pastikan aplikasi tidak dikonfigurasi untuk menjalankan IIS atau IIS Express.
Di Visual Studio, profil peluncuran default adalah untuk IIS Express. Untuk menjalankan proyek sebagai aplikasi konsol, ubah profil yang dipilih secara manual, seperti yang ditunjukkan pada cuplikan layar berikut:
Mengonfigurasi Windows Server
Tentukan port yang akan dibuka untuk aplikasi dan gunakan Windows Firewall atau cmdlet PowerShell New-NetFirewallRule untuk membuka port firewall agar lalu lintas dapat mencapai HTTP.sys. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.
Saat menyebarkan ke Azure VM, buka port di Grup Keamanan Jaringan. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.
Dapatkan dan instal sertifikat X.509, jika diperlukan.
Di Windows, buat sertifikat yang ditandatangani sendiri menggunakan cmdlet PowerShell New-SelfSignedCertificate. Untuk contoh yang tidak didukung, lihat UpdateIISExpressSSLForChrome.ps1.
Instal sertifikat yang ditandatangani sendiri atau ditandatangani CA di penyimpanan Pribadi Komputer>Lokal server.
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET Core, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET Core yang menargetkan .NET Framework).
- .NET Core: Jika aplikasi memerlukan .NET Core, dapatkan dan jalankan penginstal .NET Core Runtime dari .NET Core Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Alat penginstal untuk .NET Framework terbaru tersedia dari halaman .NET Core Downloads .
Jika aplikasi adalah penyebaran mandiri, aplikasi menyertakan runtime dalam penyebarannya. Tidak ada penginstalan kerangka kerja yang diperlukan pada server.
Konfigurasikan URL dan port di aplikasi.
Secara default, ASP.NET Core mengikat ke
http://localhost:5000
. Untuk mengonfigurasi awalan URL dan port, opsi meliputi:- UseUrls
urls
argumen baris perintahASPNETCORE_URLS
Variabel lingkungan- UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4
IP lokal server pada port 443:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); webBuilder.UseStartup<Startup>(); });
Keuntungannya
UrlPrefixes
adalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixes
mengesampingkanASPNETCORE_URLS
UseUrls
/urls
/pengaturan. Oleh karena itu, keuntungan dariUseUrls
, , danASPNETCORE_URLS
variabel lingkungan adalah lebih mudah untuk beralih antara Kestrel danurls
HTTP.sys.HTTP.sys menggunakan format string URLPrefix API Server HTTP.
Peringatan
Pengikatan wildcard tingkat atas (
http://*:80/
danhttp://+:80
) tidak boleh digunakan. Pengikatan kartubebas tingkat atas menciptakan kerentanan keamanan aplikasi. Ini berlaku untuk wildcard kuat dan lemah. Gunakan nama host eksplisit atau alamat IP daripada kartubebas. Pengikatan wildcard subdomain (misalnya,*.mysub.com
) bukan risiko keamanan jika Anda mengontrol seluruh domain induk (*.com
dibandingkan dengan , yang rentan). Untuk informasi selengkapnya, lihat RFC 9110: Bagian 7.2: Host dan :authority.Prefiks URL pra-pendaftaran di server.
Alat bawaan untuk mengonfigurasi HTTP.sys netsh.exe. netsh.exe digunakan untuk memesan awalan URL dan menetapkan sertifikat X.509. Alat ini memerlukan hak istimewa administrator.
Gunakan alat netsh.exe untuk mendaftarkan URL untuk aplikasi:
netsh http add urlacl url=<URL> user=<USER>
<URL>
: Pencari Sumber Daya Seragam (URL) yang sepenuhnya memenuhi syarat. Jangan gunakan pengikatan kartubebas. Gunakan nama host atau alamat IP lokal yang valid. URL harus menyertakan garis miring berikutnya.<USER>
: Menentukan nama pengguna atau grup pengguna.
Dalam contoh berikut, alamat IP lokal server adalah
10.0.0.4
:netsh http add urlacl url=https://10.0.0.4:443/ user=Users
Ketika URL terdaftar, alat merespons dengan
URL reservation successfully added
.Untuk menghapus URL terdaftar, gunakan
delete urlacl
perintah :netsh http delete urlacl url=<URL>
Daftarkan sertifikat X.509 di server.
Gunakan alat netsh.exe untuk mendaftarkan sertifikat untuk aplikasi:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
<IP>
: Menentukan alamat IP lokal untuk pengikatan. Jangan gunakan pengikatan kartubebas. Gunakan alamat IP yang valid.<PORT>
: Menentukan port untuk pengikatan.<THUMBPRINT>
: Thumbprint sertifikat X.509.<GUID>
: GUID yang dihasilkan pengembang untuk mewakili aplikasi untuk tujuan informasi.
Untuk tujuan referensi, simpan GUID di aplikasi sebagai tag paket:
- Di Visual Studio:
- Buka properti proyek aplikasi dengan mengklik kanan aplikasi di Penjelajah Solusi dan memilih Properti.
- Pilih tab Paket .
- Masukkan GUID yang Anda buat di bidang Tag .
- Saat tidak menggunakan Visual Studio:
Buka file proyek aplikasi.
<PackageTags>
Tambahkan properti ke baru atau yang sudah<PropertyGroup>
ada dengan GUID yang Anda buat:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
Dalam contoh berikut:
- Alamat IP lokal server adalah
10.0.0.4
. - Generator GUID acak online memberikan nilainya
appid
.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
Ketika sertifikat terdaftar, alat merespons dengan
SSL Certificate successfully added
.Untuk menghapus pendaftaran sertifikat, gunakan
delete sslcert
perintah :netsh http delete sslcert ipport=<IP>:<PORT>
Dokumentasi referensi untuk netsh.exe:
Jalankan aplikasi.
Hak istimewa administrator tidak diperlukan untuk menjalankan aplikasi saat mengikat ke localhost menggunakan HTTP (bukan HTTPS) dengan nomor port yang lebih besar dari 1024. Untuk konfigurasi lain (misalnya, menggunakan alamat IP lokal atau pengikatan ke port 443), jalankan aplikasi dengan hak istimewa administrator.
Aplikasi merespons di alamat IP publik server. Dalam contoh ini, server dicapai dari Internet di alamat IP publiknya.
104.214.79.47
Sertifikat pengembangan digunakan dalam contoh ini. Halaman dimuat dengan aman setelah melewati peringatan sertifikat browser yang tidak tepercaya.
Skenario server proksi dan penyeimbang beban
Untuk aplikasi yang dihosting oleh HTTP.sys yang berinteraksi dengan permintaan dari Internet atau jaringan perusahaan, konfigurasi tambahan mungkin diperlukan saat menghosting di belakang server proksi dan load balancer. Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core untuk bekerja dengan server proxy dan memuat penyeimbang.
Fitur HTTP/2 tingkat lanjut untuk mendukung gRPC
Fitur HTTP/2 tambahan dalam HTTP.sys mendukung gRPC, termasuk dukungan untuk trailer respons dan mengirim bingkai reset.
Persyaratan untuk menjalankan gRPC dengan HTTP.sys:
- Windows 11 Build 22000 atau yang lebih baru, Windows Server 2022 Build 20348 atau yang lebih baru.
- Koneksi TLS 1.2 atau yang lebih baru.
Trailer
Http Trailer mirip dengan Header HTTP, kecuali dikirim setelah isi respons dikirim. Untuk IIS dan HTTP.sys, hanya trailer respons HTTP/2 yang didukung.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Dalam kode contoh sebelumnya:
SupportsTrailers
memastikan bahwa trailer didukung untuk respons.DeclareTrailer
menambahkan nama trailer yang diberikan keTrailer
header respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailer
dipanggil, harus sebelum header respons dikirim.AppendTrailer
menambahkan trailer.
Reset
Reset memungkinkan server untuk mengatur ulang permintaan HTTP/2 dengan kode kesalahan tertentu. Permintaan reset dianggap dibatalkan.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
dalam contoh kode sebelumnya menentukan INTERNAL_ERROR
kode kesalahan. Untuk informasi selengkapnya tentang kode kesalahan HTTP/2, kunjungi bagian kode kesalahan spesifikasi HTTP/2.
Sumber Daya Tambahan:
HTTP.sys adalah server web untuk ASP.NET Core yang hanya berjalan di Windows. HTTP.sys adalah alternatif untuk Kestrel server dan menawarkan beberapa fitur yang Kestrel tidak disediakan.
Penting
HTTP.sys tidak kompatibel dengan Modul Inti ASP.NET dan tidak dapat digunakan dengan IIS atau IIS Express.
HTTP.sys mendukung fitur-fitur berikut:
- Autentikasi Windows
- Berbagi port
- HTTPS dengan SNI
- HTTP/2 melalui TLS (Windows 10 atau yang lebih baru)
- Transmisi file langsung
- Pembuatan cache respons
- WebSockets (Windows 8 atau yang lebih baru)
Versi Windows yang didukung:
- Windows 7 atau yang lebih baru
- Windows Server 2008 R2 atau yang lebih baru
Melihat atau mengunduh kode sampel (cara mengunduh)
Kapan menggunakan HTTP.sys
HTTP.sys berguna untuk penyebaran di mana:
Ada kebutuhan untuk mengekspos server langsung ke Internet tanpa menggunakan IIS.
Penyebaran internal memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi selengkapnya, lihat Kestrel vs. HTTP.sys
HTTP.sys adalah teknologi matang yang melindungi dari banyak jenis serangan dan memberikan ketahanan, keamanan, dan skalabilitas server web berfokus penuh. IIS sendiri berjalan sebagai pendengar HTTP di atas HTTP.sys.
Dukungan HTTP/2
HTTP/2 diaktifkan untuk aplikasi ASP.NET Core jika persyaratan dasar berikut terpenuhi:
- Windows Server 2016/Windows 10 atau yang lebih baru
- Koneksi Negosiasi Protokol Lapisan Aplikasi (ALPN)
- TLS 1.2 atau koneksi yang lebih baru
Jika koneksi HTTP/2 dibuat, HttpRequest.Protocol melaporkan HTTP/2
.
HTTP/2 diaktifkan secara default. Jika koneksi HTTP/2 tidak dibuat, koneksi akan kembali ke HTTP/1.1. Dalam rilis Windows di masa mendatang, bendera konfigurasi HTTP/2 akan tersedia, termasuk kemampuan untuk menonaktifkan HTTP/2 dengan HTTP.sys.
Autentikasi mode kernel dengan Kerberos
HTTP.sys mendelegasikan ke autentikasi mode kernel dengan protokol autentikasi Kerberos. Autentikasi mode pengguna tidak didukung dengan Kerberos dan HTTP.sys. Akun komputer harus digunakan untuk mendekripsi token/tiket Kerberos yang diperoleh dari Direktori Aktif dan diteruskan oleh klien ke server untuk mengautentikasi pengguna. Daftarkan Nama Perwakilan Layanan (SPN) untuk host, bukan pengguna aplikasi.
Cara menggunakan HTTP.sys
Mengonfigurasi aplikasi ASP.NET Core untuk menggunakan HTTP.sys
UseHttpSys Panggil metode ekstensi saat membangun host, menentukan apa pun yang diperlukan HttpSysOptions. Contoh berikut mengatur opsi ke nilai defaultnya:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
Konfigurasi HTTP.sys tambahan ditangani melalui pengaturan registri.
opsi HTTP.sys
Properti | Deskripsi | Default |
---|---|---|
AllowSynchronousIO | Mengontrol apakah input/output sinkron diizinkan untuk HttpContext.Request.Body dan HttpContext.Response.Body . |
false |
Authentication.AllowAnonymous | Izinkan permintaan anonim. | true |
Authentication.Schemes | Tentukan skema autentikasi yang diizinkan. Dapat dimodifikasi kapan saja sebelum membuang pendengar. Nilai disediakan oleh enum AuthenticationSchemes: Basic , , Kerberos , Negotiate None , dan NTLM . |
None |
EnableResponseCaching | Coba penembolokan mode kernel untuk respons dengan header yang memenuhi syarat. Respons mungkin tidak menyertakan Set-Cookie header , Vary , atau Pragma . Ini harus menyertakan Cache-Control header yang dan public nilai shared-max-age atau max-age , atau Expires header . |
true |
Http503Verbosity | Perilaku HTTP.sys saat menolak permintaan karena kondisi pembatasan. | Http503VerbosityLevel. Dasar |
MaxAccepts | Jumlah maksimum penerimaan bersamaan. | 5 lingkungan × . ProcessorCount |
MaxConnections | Jumlah maksimum koneksi bersamaan yang akan diterima. Gunakan -1 untuk tak terbatas. Gunakan null untuk menggunakan pengaturan seluruh komputer registri. |
null (seluruh mesin pengaturan) |
MaxRequestBodySize | Lihat bagian MaxRequestBodySize . | 30000000 byte (~28,6 MB) |
RequestQueueLimit | Jumlah maksimum permintaan yang dapat diantrekan. | 1000 |
RequestQueueMode |
Ini menunjukkan apakah server bertanggung jawab untuk membuat dan mengonfigurasi antrean permintaan, atau jika harus melampirkan ke antrean yang ada. Sebagian besar opsi konfigurasi yang ada tidak berlaku saat melampirkan ke antrean yang ada. |
RequestQueueMode.Create |
RequestQueueName |
Nama antrean permintaan HTTP.sys. | null (Antrean anonim) |
ThrowWriteExceptions | Tunjukkan apakah isi respons menulis yang gagal karena pemutusan sambungan klien harus melemparkan pengecualian atau selesai secara normal. | false (selesai secara normal) |
Timeouts | Mengekspos konfigurasi HTTP.sys TimeoutManager , yang juga dapat dikonfigurasi dalam registri. Ikuti tautan API untuk mempelajari selengkapnya tentang setiap pengaturan, termasuk nilai default:
|
|
UrlPrefixes | UrlPrefixCollection Tentukan untuk mendaftar dengan HTTP.sys. Yang paling berguna adalah UrlPrefixCollection.Add, yang digunakan untuk menambahkan awalan ke koleksi. Ini dapat dimodifikasi kapan saja sebelum membuang pendengar. |
MaxRequestBodySize
Ukuran maksimum yang diizinkan dari isi permintaan apa pun dalam byte. Ketika diatur ke null
, ukuran isi permintaan maksimum tidak terbatas. Batas ini tidak berpengaruh pada koneksi yang ditingkatkan, yang selalu tidak terbatas.
Metode yang disarankan untuk mengambil alih batas dalam aplikasi ASP.NET Core MVC untuk satu IActionResult
adalah dengan menggunakan RequestSizeLimitAttribute atribut pada metode tindakan:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pengecualian dilemparkan jika aplikasi mencoba mengonfigurasi batas permintaan setelah aplikasi mulai membaca permintaan. Properti IsReadOnly
dapat digunakan untuk menunjukkan apakah MaxRequestBodySize
properti dalam status baca-saja, yang berarti terlambat untuk mengonfigurasi batas.
Jika aplikasi harus mengambil MaxRequestBodySize alih per permintaan, gunakan IHttpMaxRequestBodySizeFeature:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Jika menggunakan Visual Studio, pastikan aplikasi tidak dikonfigurasi untuk menjalankan IIS atau IIS Express.
Di Visual Studio, profil peluncuran default adalah untuk IIS Express. Untuk menjalankan proyek sebagai aplikasi konsol, ubah profil yang dipilih secara manual, seperti yang ditunjukkan pada cuplikan layar berikut:
Mengonfigurasi Windows Server
Tentukan port yang akan dibuka untuk aplikasi dan gunakan Windows Firewall atau cmdlet PowerShell New-NetFirewallRule untuk membuka port firewall agar lalu lintas dapat mencapai HTTP.sys. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.
Saat menyebarkan ke Azure VM, buka port di Grup Keamanan Jaringan. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.
Dapatkan dan instal sertifikat X.509, jika diperlukan.
Di Windows, buat sertifikat yang ditandatangani sendiri menggunakan cmdlet PowerShell New-SelfSignedCertificate. Untuk contoh yang tidak didukung, lihat UpdateIISExpressSSLForChrome.ps1.
Instal sertifikat yang ditandatangani sendiri atau ditandatangani CA di penyimpanan Pribadi Komputer>Lokal server.
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET Core, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET Core yang menargetkan .NET Framework).
- .NET Core: Jika aplikasi memerlukan .NET Core, dapatkan dan jalankan penginstal .NET Core Runtime dari .NET Core Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Alat penginstal untuk .NET Framework terbaru tersedia dari halaman .NET Core Downloads .
Jika aplikasi adalah penyebaran mandiri, aplikasi menyertakan runtime dalam penyebarannya. Tidak ada penginstalan kerangka kerja yang diperlukan pada server.
Konfigurasikan URL dan port di aplikasi.
Secara default, ASP.NET Core mengikat ke
http://localhost:5000
. Untuk mengonfigurasi awalan URL dan port, opsi meliputi:- UseUrls
urls
argumen baris perintahASPNETCORE_URLS
Variabel lingkungan- UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4
IP lokal server pada port 443:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); webBuilder.UseStartup<Startup>(); });
Keuntungannya
UrlPrefixes
adalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixes
mengesampingkanASPNETCORE_URLS
UseUrls
/urls
/pengaturan. Oleh karena itu, keuntungan dariUseUrls
, , danASPNETCORE_URLS
variabel lingkungan adalah lebih mudah untuk beralih antara Kestrel danurls
HTTP.sys.HTTP.sys menggunakan format string URLPrefix API Server HTTP.
Peringatan
Pengikatan wildcard tingkat atas (
http://*:80/
danhttp://+:80
) tidak boleh digunakan. Pengikatan kartubebas tingkat atas menciptakan kerentanan keamanan aplikasi. Ini berlaku untuk wildcard kuat dan lemah. Gunakan nama host eksplisit atau alamat IP daripada kartubebas. Pengikatan wildcard subdomain (misalnya,*.mysub.com
) bukan risiko keamanan jika Anda mengontrol seluruh domain induk (*.com
dibandingkan dengan , yang rentan). Untuk informasi selengkapnya, lihat RFC 9110: Bagian 7.2: Host dan :authority.Prefiks URL pra-pendaftaran di server.
Alat bawaan untuk mengonfigurasi HTTP.sys netsh.exe. netsh.exe digunakan untuk memesan awalan URL dan menetapkan sertifikat X.509. Alat ini memerlukan hak istimewa administrator.
Gunakan alat netsh.exe untuk mendaftarkan URL untuk aplikasi:
netsh http add urlacl url=<URL> user=<USER>
<URL>
: Pencari Sumber Daya Seragam (URL) yang sepenuhnya memenuhi syarat. Jangan gunakan pengikatan kartubebas. Gunakan nama host atau alamat IP lokal yang valid. URL harus menyertakan garis miring berikutnya.<USER>
: Menentukan nama pengguna atau grup pengguna.
Dalam contoh berikut, alamat IP lokal server adalah
10.0.0.4
:netsh http add urlacl url=https://10.0.0.4:443/ user=Users
Ketika URL terdaftar, alat merespons dengan
URL reservation successfully added
.Untuk menghapus URL terdaftar, gunakan
delete urlacl
perintah :netsh http delete urlacl url=<URL>
Daftarkan sertifikat X.509 di server.
Gunakan alat netsh.exe untuk mendaftarkan sertifikat untuk aplikasi:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
<IP>
: Menentukan alamat IP lokal untuk pengikatan. Jangan gunakan pengikatan kartubebas. Gunakan alamat IP yang valid.<PORT>
: Menentukan port untuk pengikatan.<THUMBPRINT>
: Thumbprint sertifikat X.509.<GUID>
: GUID yang dihasilkan pengembang untuk mewakili aplikasi untuk tujuan informasi.
Untuk tujuan referensi, simpan GUID di aplikasi sebagai tag paket:
- Di Visual Studio:
- Buka properti proyek aplikasi dengan mengklik kanan aplikasi di Penjelajah Solusi dan memilih Properti.
- Pilih tab Paket .
- Masukkan GUID yang Anda buat di bidang Tag .
- Saat tidak menggunakan Visual Studio:
Buka file proyek aplikasi.
<PackageTags>
Tambahkan properti ke baru atau yang sudah<PropertyGroup>
ada dengan GUID yang Anda buat:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
Dalam contoh berikut:
- Alamat IP lokal server adalah
10.0.0.4
. - Generator GUID acak online memberikan nilainya
appid
.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
Ketika sertifikat terdaftar, alat merespons dengan
SSL Certificate successfully added
.Untuk menghapus pendaftaran sertifikat, gunakan
delete sslcert
perintah :netsh http delete sslcert ipport=<IP>:<PORT>
Dokumentasi referensi untuk netsh.exe:
Jalankan aplikasi.
Hak istimewa administrator tidak diperlukan untuk menjalankan aplikasi saat mengikat ke localhost menggunakan HTTP (bukan HTTPS) dengan nomor port yang lebih besar dari 1024. Untuk konfigurasi lain (misalnya, menggunakan alamat IP lokal atau pengikatan ke port 443), jalankan aplikasi dengan hak istimewa administrator.
Aplikasi merespons di alamat IP publik server. Dalam contoh ini, server dicapai dari Internet di alamat IP publiknya.
104.214.79.47
Sertifikat pengembangan digunakan dalam contoh ini. Halaman dimuat dengan aman setelah melewati peringatan sertifikat browser yang tidak tepercaya.
Skenario server proksi dan penyeimbang beban
Untuk aplikasi yang dihosting oleh HTTP.sys yang berinteraksi dengan permintaan dari Internet atau jaringan perusahaan, konfigurasi tambahan mungkin diperlukan saat menghosting di belakang server proksi dan load balancer. Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core untuk bekerja dengan server proxy dan memuat penyeimbang.
Fitur HTTP/2 tingkat lanjut untuk mendukung gRPC
Fitur HTTP/2 tambahan dalam HTTP.sys mendukung gRPC, termasuk dukungan untuk trailer respons dan mengirim bingkai reset.
Persyaratan untuk menjalankan gRPC dengan HTTP.sys:
- Windows 10, OS Build 19041.508 atau yang lebih baru
- TLS 1.2 atau koneksi yang lebih baru
Trailer
Http Trailer mirip dengan Header HTTP, kecuali dikirim setelah isi respons dikirim. Untuk IIS dan HTTP.sys, hanya trailer respons HTTP/2 yang didukung.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Dalam kode contoh sebelumnya:
SupportsTrailers
memastikan bahwa trailer didukung untuk respons.DeclareTrailer
menambahkan nama trailer yang diberikan keTrailer
header respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailer
dipanggil, harus sebelum header respons dikirim.AppendTrailer
menambahkan trailer.
Reset
Reset memungkinkan server untuk mengatur ulang permintaan HTTP/2 dengan kode kesalahan tertentu. Permintaan reset dianggap dibatalkan.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
dalam contoh kode sebelumnya menentukan INTERNAL_ERROR
kode kesalahan. Untuk informasi selengkapnya tentang kode kesalahan HTTP/2, kunjungi bagian kode kesalahan spesifikasi HTTP/2.
Sumber Daya Tambahan:
ASP.NET Core