Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Note
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 dari artikel ini.
Warning
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 9 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.
Important
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)
- HTTP/3 melalui TLS (Windows 11 atau yang lebih baru)
- Transmisi file langsung
- Penggunaan cache respons
- WebSockets (Windows 8 atau yang lebih baru)
- Deskriptor keamanan yang dapat disesuaikan
- Pengeluaran kumpulan memori otomatis
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
httpsurl 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.
Menyesuaikan deskriptor keamanan
Antrean permintaan di HTTP.sys adalah struktur tingkat kernel yang untuk sementara menyimpan permintaan HTTP masuk hingga aplikasi Anda siap memprosesnya. Kelola akses ke antrean permintaan dengan menggunakan properti RequestQueueSecurityDescriptor di HttpSysOptions. Setel ke instans GenericSecurityDescriptor ketika mengonfigurasi server HTTP.sys Anda.
Dengan menyesuaikan deskriptor keamanan, Anda dapat mengizinkan atau menolak akses pengguna atau grup tertentu ke antrean permintaan. Ini berguna dalam skenario di mana Anda ingin membatasi atau mendelegasikan penanganan permintaan HTTP.sys di tingkat sistem operasi.
Misalnya, kode berikut memungkinkan semua pengguna yang diautentikasi tetapi menolak tamu:
using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.AspNetCore.Server.HttpSys;
// Create a new security descriptor
var securityDescriptor = new CommonSecurityDescriptor(isContainer: false, isDS: false, sddlForm: string.Empty);
// Create a discretionary access control list (DACL)
var dacl = new DiscretionaryAcl(isContainer: false, isDS: false, capacity: 2);
dacl.AddAccess(
AccessControlType.Allow,
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),
-1,
InheritanceFlags.None,
PropagationFlags.None
);
dacl.AddAccess(
AccessControlType.Deny,
new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null),
-1,
InheritanceFlags.None,
PropagationFlags.None
);
// Assign the DACL to the security descriptor
securityDescriptor.DiscretionaryAcl = dacl;
// Configure HTTP.sys options
var builder = WebApplication.CreateBuilder();
builder.WebHost.UseHttpSys(options =>
{
options.RequestQueueSecurityDescriptor = securityDescriptor;
});
Properti RequestQueueSecurityDescriptor hanya berlaku saat membuat antrean permintaan baru. Properti tidak akan memengaruhi daftar antrian permintaan yang sudah ada.
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
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET yang menargetkan .NET Framework).
- .NET: Jika aplikasi memerlukan .NET, dapatkan dan jalankan penginstal .NET Runtime dari .NET Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Penginstal untuk versi terbaru .NET Framework tersedia dari halaman Unduhan .NET.
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
-
urlsargumen baris perintah -
ASPNETCORE_URLSVariabel lingkungan - UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4IP 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
UrlPrefixesadalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixesmengesampingkanUseUrls/urls/ASPNETCORE_URLSpengaturan. Oleh karena itu, keuntungan dariUseUrls, , danurlsvariabel lingkungan adalah lebih mudah untuk beralih antaraASPNETCORE_URLSdan KestrelHTTP.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.
Warning
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 (*.comdibandingkan 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;8081Contoh 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=UsersKetika URL terdaftar, alat merespons dengan
URL reservation successfully added.Untuk menghapus URL terdaftar, gunakan
delete urlaclperintah :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 sslcertperintah :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.47Sertifikat 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](/dotnet/api/microsoft.aspnetcore.server.httpsys.ihttpsysrequesttimingfeature.trygetelapsedtime memberikan waktu yang telah 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.
Trailers
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:
-
SupportsTrailersmemastikan bahwa trailer didukung untuk respons. -
DeclareTrailermenambahkan nama trailer yang diberikan keTrailerheader respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailerdipanggil, harus sebelum header respons dikirim. -
AppendTrailermenambahkan 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.
Tracing
Untuk informasi tentang cara mendapatkan jejak dari HTTP.sys, lihat Skenario Pengelolaan HTTP.sys.
Pengeluaran otomatis dari kumpulan memori
Kumpulan memori yang digunakan oleh Kestrel, IIS, dan HTTP.sys secara otomatis mengeluarkan blok memori saat aplikasi diam atau di bawah beban rendah. Fitur ini berjalan secara otomatis dan tidak perlu diaktifkan atau dikonfigurasi secara manual.
Dalam versi .NET yang lebih lama dari 10, memori yang dialokasikan oleh kumpulan tetap dicadangkan, bahkan ketika tidak digunakan. Fitur pengeluaran otomatis ini mengurangi penggunaan memori secara keseluruhan dan membantu aplikasi tetap responsif di bawah berbagai beban kerja.
Menggunakan metrik kumpulan memori
Kumpulan memori default yang digunakan oleh implementasi server ASP.NET Core mencakup metrik, yang dapat digunakan untuk memantau dan menganalisis pola penggunaan memori. Metrik berada di bawah nama "Microsoft.AspNetCore.MemoryPool".
Untuk informasi tentang metrik dan cara menggunakannya, lihat metrik ASP.NET Core.
Mengelola kumpulan memori
Selain menggunakan kumpulan memori secara efisien dengan mengusir blok memori yang tidak diperlukan, ASP.NET Core menyediakan IMemoryPoolFactory bawaan dan implementasi. Ini membuat implementasi tersedia untuk aplikasi Anda melalui injeksi dependensi.
Contoh kode berikut menunjukkan layanan latar belakang sederhana yang menggunakan implementasi pabrik kumpulan memori bawaan untuk membuat kumpulan memori. Kumpulan ini mendapat manfaat dari fitur pengeluaran otomatis:
public class MyBackgroundService : BackgroundService
{
private readonly MemoryPool<byte> _memoryPool;
public MyBackgroundService(IMemoryPoolFactory<byte> factory)
{
_memoryPool = factory.Create();
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
await Task.Delay(20, stoppingToken);
// do work that needs memory
// consider checking _memoryPool.MaxBufferSize
var rented = _memoryPool.Rent(100);
rented.Dispose();
}
catch (OperationCanceledException)
{
return;
}
}
}
}
Untuk menggunakan pabrik kumpulan memori kustom, buat kelas yang mengimplementasikan IMemoryPoolFactory dan mendaftarkannya dengan injeksi dependensi, seperti contoh berikut. Kumpulan memori yang dibuat dengan cara ini juga mendapat manfaat dari fitur pengeluaran otomatis:
services.AddSingleton<IMemoryPoolFactory<byte>,
CustomMemoryPoolFactory>();
public class CustomMemoryPoolFactory : IMemoryPoolFactory<byte>
{
public MemoryPool<byte> Create()
{
// Return a custom MemoryPool implementation
// or the default, as is shown here.
return MemoryPool<byte>.Shared;
}
}
Saat Anda menggunakan kumpulan memori, waspadai MaxBufferSizekumpulan .
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.
Important
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
- Penggunaan 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
httpsurl 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
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET yang menargetkan .NET Framework).
- .NET: Jika aplikasi memerlukan .NET, dapatkan dan jalankan penginstal .NET Runtime dari .NET Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Penginstal untuk versi terbaru .NET Framework tersedia dari halaman Unduhan .NET.
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
-
urlsargumen baris perintah -
ASPNETCORE_URLSVariabel lingkungan - UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4IP 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
UrlPrefixesadalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixesmengesampingkanUseUrls/urls/ASPNETCORE_URLSpengaturan. Oleh karena itu, keuntungan dariUseUrls, , danurlsvariabel lingkungan adalah lebih mudah untuk beralih antaraASPNETCORE_URLSdan KestrelHTTP.sys.HTTP.sys menggunakan format string URLPrefix API Server HTTP.
Warning
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 (*.comdibandingkan 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=UsersKetika URL terdaftar, alat merespons dengan
URL reservation successfully added.Untuk menghapus URL terdaftar, gunakan
delete urlaclperintah :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 sslcertperintah :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.47Sertifikat 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.
Trailers
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:
-
SupportsTrailersmemastikan bahwa trailer didukung untuk respons. -
DeclareTrailermenambahkan nama trailer yang diberikan keTrailerheader respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailerdipanggil, harus sebelum header respons dikirim. -
AppendTrailermenambahkan 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.
Important
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
- Penggunaan 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.
opsiHTTP.sys
| Property | Description | 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 | None |
| EnableResponseCaching | Coba penembolokan mode kernel untuk respons dengan header yang memenuhi syarat. Respons mungkin tidak menyertakan Set-Cookieheader , 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 × . JumlahProsesor |
| MaxConnections | Jumlah maksimum koneksi bersamaan yang akan diterima. Gunakan -1 untuk tak terbatas. Gunakan null untuk menggunakan pengaturan seluruh komputer registri. |
null(machine-wide setting) |
| 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
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET yang menargetkan .NET Framework).
- .NET: Jika aplikasi memerlukan .NET, dapatkan dan jalankan penginstal .NET Runtime dari .NET Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Penginstal untuk versi terbaru .NET Framework tersedia dari halaman Unduhan .NET.
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
-
urlsargumen baris perintah -
ASPNETCORE_URLSVariabel lingkungan - UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4IP 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
UrlPrefixesadalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixesmengesampingkanUseUrls/urls/ASPNETCORE_URLSpengaturan. Oleh karena itu, keuntungan dariUseUrls, , danurlsvariabel lingkungan adalah lebih mudah untuk beralih antaraASPNETCORE_URLSdan KestrelHTTP.sys.HTTP.sys menggunakan format string URLPrefix API Server HTTP.
Warning
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 (*.comdibandingkan 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=UsersKetika URL terdaftar, alat merespons dengan
URL reservation successfully added.Untuk menghapus URL terdaftar, gunakan
delete urlaclperintah :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 sslcertperintah :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.47Sertifikat 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
Trailers
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:
-
SupportsTrailersmemastikan bahwa trailer didukung untuk respons. -
DeclareTrailermenambahkan nama trailer yang diberikan keTrailerheader respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailerdipanggil, harus sebelum header respons dikirim. -
AppendTrailermenambahkan 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.
Important
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)
- HTTP/3 melalui TLS (Windows 11 atau yang lebih baru)
- Transmisi file langsung
- Penggunaan cache respons
- WebSockets (Windows 8 atau yang lebih baru)
- Deskriptor keamanan yang dapat disesuaikan
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
httpsurl 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
Jika aplikasi adalah penyebaran yang bergantung pada kerangka kerja, instal .NET, .NET Framework, atau keduanya (jika aplikasi adalah aplikasi .NET yang menargetkan .NET Framework).
- .NET: Jika aplikasi memerlukan .NET, dapatkan dan jalankan penginstal .NET Runtime dari .NET Downloads. Jangan instal SDK lengkap di server.
- .NET Framework: Jika aplikasi memerlukan .NET Framework, lihat panduan penginstalan .NET Framework. Instal .NET Framework yang diperlukan. Penginstal untuk versi terbaru .NET Framework tersedia dari halaman Unduhan .NET.
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
-
urlsargumen baris perintah -
ASPNETCORE_URLSVariabel lingkungan - UrlPrefixes
Contoh kode berikut menunjukkan cara menggunakan UrlPrefixes dengan alamat
10.0.0.4IP 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
UrlPrefixesadalah bahwa pesan kesalahan segera dihasilkan untuk awalan yang diformat dengan tidak benar.Pengaturan dalam
UrlPrefixesmengesampingkanUseUrls/urls/ASPNETCORE_URLSpengaturan. Oleh karena itu, keuntungan dariUseUrls, , danurlsvariabel lingkungan adalah lebih mudah untuk beralih antaraASPNETCORE_URLSdan KestrelHTTP.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.
Warning
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 (*.comdibandingkan 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;8081Contoh 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=UsersKetika URL terdaftar, alat merespons dengan
URL reservation successfully added.Untuk menghapus URL terdaftar, gunakan
delete urlaclperintah :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 sslcertperintah :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.47Sertifikat 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](/dotnet/api/microsoft.aspnetcore.server.httpsys.ihttpsysrequesttimingfeature.trygetelapsedtime memberikan waktu yang telah 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.
Trailers
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:
-
SupportsTrailersmemastikan bahwa trailer didukung untuk respons. -
DeclareTrailermenambahkan nama trailer yang diberikan keTrailerheader respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. JikaDeclareTrailerdipanggil, harus sebelum header respons dikirim. -
AppendTrailermenambahkan 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.
Tracing
Untuk informasi tentang cara mendapatkan jejak dari HTTP.sys, lihat Skenario Pengelolaan HTTP.sys.
Sumber daya tambahan
ASP.NET Core