Implementasi server web HTTP.sys di ASP.NET Core

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.

    HTTP.sys berkomunikasi secara langsung dengan Internet

  • Penyebaran internal memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi selengkapnya, lihat Kestrel vs. HTTP.sys

    HTTP.sys berkomunikasi secara langsung dengan jaringan internal

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:

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:

Pilih profil aplikasi konsol

Mengonfigurasi Windows Server

  1. 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.

  2. Saat menyebarkan ke Azure VM, buka port di Grup Keamanan Jaringan. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.

  3. 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.

  4. 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.

  5. Konfigurasikan URL dan port di aplikasi.

    Secara default, ASP.NET Core mengikat ke http://localhost:5000. Untuk mengonfigurasi awalan URL dan port, opsi meliputi:

    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_URLSUseUrls/urls/pengaturan. Oleh karena itu, keuntungan dari UseUrls, , dan ASPNETCORE_URLS variabel lingkungan adalah lebih mudah untuk beralih antara Kestrel dan urlsHTTP.sys.

    HTTP.sys mengenali dua jenis wild card dalam awalan URL:

    • *adalah pengikatan yang lemah, juga dikenal sebagai pengikatan fallback. Jika awalan URL adalah http://*:5000, dan sesuatu yang lain terikat ke port 5000, pengikatan ini tidak akan digunakan.
    • +adalah pengikatan yang kuat. Jika awalan URL adalah http://+:5000, pengikatan ini akan digunakan sebelum pengikatan port 5000 lainnya.

    Untuk informasi selengkapnya, lihat String UrlPrefix.

    Peringatan

    Pengikatan wildcard tingkat atas (http://*:80/ dan http://+: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_ atau ASPNETCORE_ , atau ditentukan langsung melalui input konfigurasi lainnya, seperti appsettings.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.

  6. 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>
    
  7. 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>9412ee86-c21b-4eb8-bd89-f650fbf44931</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="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    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:

  8. 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.

    Jendela browser memperlihatkan halaman Indeks aplikasi yang dimuat

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 ke Trailer header respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. Jika DeclareTrailer 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.

    HTTP.sys berkomunikasi secara langsung dengan Internet

  • Penyebaran internal memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi selengkapnya, lihat Kestrel vs. HTTP.sys

    HTTP.sys berkomunikasi secara langsung dengan jaringan internal

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:

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:

Pilih profil aplikasi konsol

Mengonfigurasi Windows Server

  1. 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.

  2. Saat menyebarkan ke Azure VM, buka port di Grup Keamanan Jaringan. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.

  3. 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.

  4. 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.

  5. Konfigurasikan URL dan port di aplikasi.

    Secara default, ASP.NET Core mengikat ke http://localhost:5000. Untuk mengonfigurasi awalan URL dan port, opsi meliputi:

    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_URLSUseUrls/urls/pengaturan. Oleh karena itu, keuntungan dari UseUrls, , dan ASPNETCORE_URLS variabel lingkungan adalah lebih mudah untuk beralih antara Kestrel dan urlsHTTP.sys.

    HTTP.sys menggunakan format string URLPrefix API Server HTTP.

    Peringatan

    Pengikatan wildcard tingkat atas (http://*:80/ dan http://+: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.

  6. 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>
    
  7. 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>9412ee86-c21b-4eb8-bd89-f650fbf44931</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="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    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:

  8. 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.

    Jendela browser memperlihatkan halaman Indeks aplikasi yang dimuat

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 ke Trailer header respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. Jika DeclareTrailer 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.

    HTTP.sys berkomunikasi secara langsung dengan Internet

  • Penyebaran internal memerlukan fitur yang tidak tersedia di Kestrel. Untuk informasi selengkapnya, lihat Kestrel vs. HTTP.sys

    HTTP.sys berkomunikasi secara langsung dengan jaringan internal

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:

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, NegotiateNone, dan NTLM. 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 × .
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:

Pilih profil aplikasi konsol

Mengonfigurasi Windows Server

  1. 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.

  2. Saat menyebarkan ke Azure VM, buka port di Grup Keamanan Jaringan. Dalam perintah dan konfigurasi aplikasi berikut, port 443 digunakan.

  3. 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.

  4. 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.

  5. Konfigurasikan URL dan port di aplikasi.

    Secara default, ASP.NET Core mengikat ke http://localhost:5000. Untuk mengonfigurasi awalan URL dan port, opsi meliputi:

    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_URLSUseUrls/urls/pengaturan. Oleh karena itu, keuntungan dari UseUrls, , dan ASPNETCORE_URLS variabel lingkungan adalah lebih mudah untuk beralih antara Kestrel dan urlsHTTP.sys.

    HTTP.sys menggunakan format string URLPrefix API Server HTTP.

    Peringatan

    Pengikatan wildcard tingkat atas (http://*:80/ dan http://+: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.

  6. 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>
    
  7. 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>9412ee86-c21b-4eb8-bd89-f650fbf44931</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="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    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:

  8. 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.

    Jendela browser memperlihatkan halaman Indeks aplikasi yang dimuat

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 ke Trailer header respons. Mendeklarasikan trailer respons bersifat opsional, tetapi disarankan. Jika DeclareTrailer 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: