Apa yang baru dalam ASP.NET Core 8.0
Artikel ini menyoroti perubahan paling signifikan dalam ASP.NET Core 8.0 dengan tautan ke dokumentasi yang relevan.
Blazor
Antarmuka pengguna web tumpukan penuh
Dengan rilis .NET 8, Blazor adalah kerangka kerja antarmuka pengguna web tumpukan penuh untuk mengembangkan aplikasi yang merender konten di tingkat komponen atau halaman dengan:
- Penyajian Server Statis (juga disebut penyajian sisi server statis, SSR statis) untuk menghasilkan HTML statis di server.
- Penyajian Server Interaktif (juga disebut penyajian sisi server interaktif, SSR interaktif) untuk menghasilkan komponen interaktif dengan pra-penyajian di server.
- Penyajian WebAssembly Interaktif (juga disebut penyajian sisi klien, CSR, yang selalu diasumsikan interaktif) untuk menghasilkan komponen interaktif pada klien dengan pra-penyajian di server.
- Penyajian Interactive Auto (otomatis) untuk awalnya menggunakan runtime ASP.NET Core sisi server untuk penyajian dan interaktivitas konten. Runtime .NET WebAssembly pada klien digunakan untuk penyajian dan interaktivitas berikutnya setelah Blazor bundel diunduh dan runtime WebAssembly diaktifkan. Penyajian Otomatis Interaktif biasanya memberikan pengalaman startup aplikasi tercepat.
Mode render interaktif juga merender konten secara default.
Untuk informasi lebih lanjut, baca artikel berikut:
- Blazor Inti: Bagian baru tentang penyajian dan konsep statis/interaktif muncul di bagian atas artikel.
- mode render ASP.NET Core Blazor
- Cakupan migrasi: Migrasi dari ASP.NET Core 7.0 ke 8.0
Contoh di Blazor seluruh dokumentasi telah diperbarui untuk digunakan dalam Blazor Web Apps. Blazor Server contoh tetap dalam konten versi untuk .NET 7 atau yang lebih lama.
Artikel baru tentang pustaka kelas dengan penyajian sisi server statis (SSR statis)
Kami telah menambahkan artikel baru yang membahas kewenangan pustaka komponen di Razor pustaka kelas (RCL) dengan penyajian sisi server statis (SSR statis).
Untuk informasi selengkapnya, lihat pustaka kelas ASP.NET Core Razor (RCL) dengan penyajian sisi server statis (SSR statis).
Artikel baru tentang masalah penembolokan HTTP
Kami telah menambahkan artikel baru yang membahas beberapa masalah penembolokan HTTP umum yang dapat terjadi saat meningkatkan Blazor aplikasi di seluruh versi utama dan cara mengatasi masalah penembolokan HTTP.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Templat baru Blazor Web App
Kami telah memperkenalkan templat proyek baru Blazor : Blazor Web App templat. Templat baru menyediakan satu titik awal untuk menggunakan Blazor komponen untuk membangun gaya UI web apa pun. Templat ini menggabungkan kekuatan model yang ada Blazor Server dan Blazor WebAssembly hosting dengan kemampuan baru Blazor yang ditambahkan di .NET 8: penyajian sisi server statis (SSR statis), penyajian streaming, navigasi dan penanganan formulir yang ditingkatkan, dan kemampuan untuk menambahkan interaktivitas menggunakan baik Blazor Server atau Blazor WebAssembly berdasarkan per komponen.
Sebagai bagian dari menyatukan berbagai Blazor model hosting ke dalam satu model di .NET 8, kami juga mengonsolidasikan jumlah Blazor templat proyek. Kami menghapus Blazor Server templat, dan opsi ASP.NET Core Hosted telah dihapus dari Blazor WebAssembly templat. Kedua skenario ini diwakili oleh opsi saat menggunakan Blazor Web App templat.
Catatan
Blazor Server Aplikasi dan Blazor WebAssembly yang ada tetap didukung di .NET 8. Secara opsional, aplikasi ini dapat diperbarui untuk menggunakan fitur antarmuka pengguna Blazor web tumpukan penuh baru.
Untuk informasi selengkapnya tentang templat baru Blazor Web App , lihat artikel berikut ini:
Penginisialisasi baru JS untuk Blazor Web Apps
Untuk Blazor Serveraplikasi , Blazor WebAssembly, dan Blazor Hybrid :
-
beforeStart
digunakan untuk tugas seperti menyesuaikan proses pemuatan, tingkat pengelogan, dan opsi lainnya. -
afterStarted
digunakan untuk tugas seperti mendaftarkan Blazor pendengar peristiwa dan jenis peristiwa kustom.
Inisialisasi warisan JS sebelumnya tidak dipanggil secara default dalam Blazor Web App. Untuk Blazor Web Apps, sekumpulan JS penginisialisasi baru digunakan: beforeWebStart
, , afterWebStarted
, beforeServerStart
, afterServerStarted
beforeWebAssemblyStart
, dan afterWebAssemblyStarted
.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Pemisahan panduan pra-penyajian dan integrasi
Untuk rilis .NET sebelumnya, kami membahas pra-penyajian dan integrasi dalam satu artikel. Untuk menyederhanakan dan memfokuskan cakupan kami, kami telah membagi subjek menjadi artikel baru berikut, yang telah diperbarui untuk .NET 8:
- Prarender komponen ASP.NET Core Razor
- Mengintegrasikan komponen ASP.NET Core Razor dengan MVC atau Razor Pages
Mempertahankan status komponen dalam Blazor Web App
Anda dapat bertahan dan membaca status komponen dalam menggunakan layanan yang Blazor Web App ada PersistentComponentState . Ini berguna untuk mempertahankan status komponen selama pra-penyajian.
Blazor Web Apps secara otomatis mempertahankan status tingkat aplikasi terdaftar yang dibuat selama pra-penyajian, menghapus kebutuhan akan Pembantu Tag Status Komponen Yang Bertahan.
Penanganan formulir dan pengikatan model
Blazor komponen sekarang dapat menangani permintaan formulir yang dikirimkan, termasuk pengikatan model dan memvalidasi data permintaan. Komponen dapat mengimplementasikan formulir dengan penangan formulir terpisah menggunakan tag HTML <form>
standar atau menggunakan komponen yang ada EditForm
.
Pengikatan model formulir untuk Blazor menghormati atribut kontrak data (misalnya, [DataMember]
dan [IgnoreDataMember]
) untuk menyesuaikan bagaimana data formulir terikat dengan model.
Dukungan antiforgery baru disertakan dalam .NET 8. Komponen baru AntiforgeryToken
merender token antiforgery sebagai bidang tersembunyi, dan atribut baru [RequireAntiforgeryToken]
memungkinkan perlindungan antiforgery. Jika pemeriksaan antiforgery gagal, respons 400 (Permintaan Buruk) dikembalikan tanpa pemrosesan formulir. Fitur antiforgery baru diaktifkan secara default untuk formulir berdasarkan Editform
dan dapat diterapkan secara manual ke formulir HTML standar.
Untuk informasi selengkapnya, lihat Blazor formulir ASP.NET Core.
Navigasi dan penanganan formulir yang disempurnakan
Penyajian sisi server statis (SSR statis) biasanya melakukan refresh halaman penuh setiap kali pengguna menavigasi ke halaman baru atau mengirimkan formulir. Di .NET 8, Blazor dapat meningkatkan navigasi halaman dan penanganan formulir dengan mencegat permintaan dan melakukan permintaan pengambilan sebagai gantinya.
Blazor kemudian menangani konten respons yang dirender dengan menambalnya ke DOM browser. Navigasi dan penanganan formulir yang ditingkatkan menghindari kebutuhan akan refresh halaman penuh dan mempertahankan lebih banyak status halaman, sehingga halaman dimuat lebih cepat dan lebih lancar. Navigasi yang ditingkatkan diaktifkan secara default ketika Blazor skrip (blazor.web.js
) dimuat. Penanganan formulir yang ditingkatkan dapat diaktifkan secara opsional untuk formulir tertentu.
API navigasi baru yang disempurnakan memungkinkan Anda menyegarkan halaman saat ini dengan memanggil NavigationManager.Refresh(bool forceLoad = false)
.
Untuk informasi selengkapnya, lihat bagian Blazorberikut dari artikel Perutean :
Artikel baru tentang penyajian statis dengan navigasi yang disempurnakan untuk JS interop
Beberapa aplikasi bergantung pada JS interop untuk melakukan tugas inisialisasi yang khusus untuk setiap halaman. Saat menggunakan Blazorfitur navigasi yang disempurnakan dengan halaman yang dirender secara statis yang melakukan JS tugas inisialisasi interop, spesifik JS halaman mungkin tidak dijalankan lagi seperti yang diharapkan setiap kali navigasi halaman yang ditingkatkan terjadi. Artikel baru menjelaskan cara mengatasi skenario ini dalam Blazor Web App:
ASP.NET Core Blazor JavaScript dengan penyajian sisi server statis (SSR statis)
Penyajian streaming
Anda sekarang dapat melakukan streaming pembaruan konten pada aliran respons saat menggunakan penyajian sisi server statis (SSR statis) dengan Blazor. Penyajian streaming dapat meningkatkan pengalaman pengguna untuk halaman yang melakukan tugas asinkron yang berjalan lama untuk sepenuhnya dirender dengan merender konten segera setelah tersedia.
Misalnya, untuk merender halaman, Anda mungkin perlu membuat kueri database yang berjalan lama atau panggilan API. Biasanya, tugas asinkron yang dijalankan sebagai bagian dari penyajian halaman harus diselesaikan sebelum respons yang dirender dikirim, yang dapat menunda pemuatan halaman. Penyajian streaming awalnya merender seluruh halaman dengan konten tempat penampung saat operasi asinkron dijalankan. Setelah operasi asinkron selesai, konten yang diperbarui dikirim ke klien pada koneksi respons yang sama dan di-patch oleh ke DOM. Manfaat dari pendekatan ini adalah tata letak utama aplikasi dirender secepat mungkin dan halaman diperbarui segera setelah konten siap.
Untuk informasi lebih lanjut, lihat perenderan komponen Razor ASP.NET Core.
Menyuntikkan layanan kunci ke dalam komponen
Blazor sekarang mendukung menyuntikkan layanan kunci menggunakan [Inject]
atribut . Kunci memungkinkan pencakupan pendaftaran dan konsumsi layanan saat menggunakan injeksi dependensi. Gunakan properti baru InjectAttribute.Key
untuk menentukan kunci layanan yang akan disuntikkan:
[Inject(Key = "my-service")]
public IMyService MyService { get; set; }
Arahan @inject
Razor tidak mendukung layanan ber-kunci untuk rilis ini, tetapi pekerjaan dilacak oleh Pembaruan @inject
untuk mendukung layanan ber-kunci (dotnet/razor #9286) untuk rilis .NET di masa mendatang.
Untuk informasi selengkapnya, lihat Injeksi dependensi ASP.NET Core Blazor.
Akses HttpContext
sebagai parameter berskala
Anda sekarang dapat mengakses parameter saat ini HttpContext sebagai kaskading dari komponen server statis:
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
HttpContext Mengakses dari komponen server statis mungkin berguna untuk memeriksa dan memodifikasi header atau properti lainnya.
Untuk contoh yang meneruskan HttpContext token status, akses, dan refresh, ke komponen, lihat ASP.NET sisi server Core dan Blazor Web App skenario keamanan tambahan.
Merender Razor komponen di luar ASP.NET Core
Anda sekarang dapat merender Razor komponen di luar konteks permintaan HTTP. Anda dapat merender Razor komponen sebagai HTML langsung ke string atau melakukan streaming secara independen dari lingkungan hosting ASP.NET Core. Ini nyaman untuk skenario di mana Anda ingin menghasilkan fragmen HTML, seperti untuk menghasilkan email atau konten situs statis.
Untuk informasi selengkapnya, lihat Merender Razor komponen di luar ASP.NET Core.
Dukungan bagian
Komponen baru SectionOutlet
dan SectionContent
dalam Blazor menambahkan dukungan untuk menentukan outlet untuk konten yang dapat diisi nanti. Bagian sering digunakan untuk menentukan tempat penampung dalam tata letak yang kemudian diisi oleh halaman tertentu. Bagian dirujuk dengan nama unik atau menggunakan ID objek unik.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Dukungan halaman kesalahan
Blazor Web Apps dapat menentukan halaman kesalahan kustom untuk digunakan dengan middleware penanganan pengecualian inti ASP.NET.
Blazor Web App Templat proyek menyertakan halaman kesalahan default (Components/Pages/Error.razor
) dengan konten serupa dengan yang digunakan di aplikasi MVC dan Razor Pages. Ketika halaman kesalahan dirender sebagai respons terhadap permintaan dari Middleware Penanganan Pengecualian, halaman kesalahan selalu dirender sebagai komponen server statis, bahkan jika interaktivitas diaktifkan.
Error.razor
dalam sumber referensi 8.0
QuickGrid
Komponen BlazorQuickGrid tidak lagi eksperimental dan sekarang menjadi bagian dari kerangka kerja Blazor di .NET 8.
QuickGrid adalah komponen kisi performa tinggi untuk menampilkan data dalam bentuk tabular. QuickGrid dibangun untuk menjadi cara yang sederhana dan nyaman untuk menampilkan data Anda, sambil tetap menyediakan fitur canggih, seperti pengurutan, pemfilteran, penomoran halaman, dan virtualisasi.
Untuk informasi selengkapnya, lihat komponen ASP.NET Core Blazor 'QuickGrid'.
Rutekan ke elemen bernama
Blazor sekarang mendukung penggunaan perutean sisi klien untuk menavigasi ke elemen HTML tertentu pada halaman menggunakan fragmen URL standar. Jika Anda menentukan pengidentifikasi untuk elemen HTML menggunakan atribut standar id
, Blazor gulir dengan benar ke elemen tersebut saat fragmen URL cocok dengan pengidentifikasi elemen.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Nilai berskala tingkat akar
Nilai kaskading tingkat akar dapat didaftarkan untuk seluruh hierarki komponen. Nilai dan langganan berskala bernama untuk pemberitahuan pembaruan didukung.
Untuk informasi selengkapnya, lihat Blazor berskala Core.
Virtualisasi konten kosong
Gunakan parameter baru EmptyContent
pada Virtualize
komponen untuk menyediakan konten ketika komponen telah dimuat dan Items
kosong atau ItemsProviderResult<T>.TotalItemCount
nol.
Untuk informasi selengkapnya, lihat Razor komponen ASP.NET Core.
Tutup sirkuit ketika tidak ada komponen server interaktif yang tersisa
Komponen server interaktif menangani peristiwa UI web menggunakan koneksi real-time dengan browser yang disebut sirkuit. Sirkuit dan status terkait disiapkan ketika komponen server interaktif akar dirender. Sirkuit ditutup ketika tidak ada komponen server interaktif yang tersisa di halaman, yang membebaskan sumber daya server.
Memantau SignalR aktivitas sirkuit
Anda sekarang dapat memantau aktivitas sirkuit masuk di aplikasi sisi server menggunakan metode baru CreateInboundActivityHandler
di CircuitHandler
. Aktivitas sirkuit masuk adalah aktivitas apa pun yang dikirim dari browser ke server, seperti peristiwa UI atau panggilan interop JavaScript-to-.NET.
Untuk informasi selengkapnya, lihat Blazor ASP.NET CoreSignalR.
Performa runtime yang lebih cepat dengan Jiterpreter
Jiterpreter adalah fitur runtime baru di .NET 8 yang memungkinkan dukungan kompilasi Just-in-Time (JIT) parsial saat berjalan di WebAssembly untuk mencapai performa runtime yang ditingkatkan.
Untuk informasi selengkapnya, lihat Host dan sebarkan ASP.NET Core Blazor WebAssembly.
SimD ahead-of-time (AOT) dan penanganan pengecualian
Blazor WebAssembly Kompilasi ahead-of-time (AOT) sekarang menggunakan penanganan SIMD lebar Tetap webAssembly dan Pengecualian WebAssembly secara default untuk meningkatkan performa runtime.
Untuk informasi lebih lanjut, baca artikel berikut:
Kemasan Webcil yang ramah web
Webcil adalah kemasan rakitan .NET yang ramah web yang menghapus konten khusus untuk eksekusi Windows asli untuk menghindari masalah saat menyebarkan ke lingkungan yang memblokir pengunduhan atau penggunaan .dll
file. Webcil diaktifkan secara default untuk Blazor WebAssembly aplikasi.
Untuk informasi selengkapnya, lihat Host dan sebarkan ASP.NET Core Blazor WebAssembly.
Catatan
Sebelum rilis .NET 8, panduan dalam tata letak Penyebaran untuk aplikasiBlazor WebAssembly ASP.NET Core membahas lingkungan yang memblokir klien agar tidak mengunduh dan menjalankan DLL dengan pendekatan bundling multipart. Di .NET 8 atau yang lebih baru, Blazor menggunakan format file Webcil untuk mengatasi masalah ini. Bundling multipihak menggunakan paket NuGet eksperimental yang dijelaskan oleh artikel tata letak penyebaran WebAssembly tidak didukung untuk Blazor aplikasi di .NET 8 atau yang lebih baru. Untuk informasi selengkapnya, lihat Meningkatkan Microsoft.AspNetCore.Components.WebAssembly.MultipartBundle
paket untuk menentukan format bundel kustom (dotnet/aspnetcore #36978). Jika Anda ingin terus menggunakan paket bundel multibagian di aplikasi .NET 8 atau yang lebih baru, Anda dapat menggunakan panduan dalam artikel untuk membuat paket NuGet bundling multibagian Anda sendiri, tetapi tidak akan didukung oleh Microsoft.
Blazor WebAssembly penyempurnaan penelusuran kesalahan
Saat men-debug .NET di WebAssembly, debugger sekarang mengunduh data simbol dari lokasi simbol yang dikonfigurasi di preferensi Visual Studio. Ini meningkatkan pengalaman penelusuran kesalahan untuk aplikasi yang menggunakan paket NuGet.
Anda sekarang dapat men-debug Blazor WebAssembly aplikasi menggunakan Firefox. Aplikasi penelusuran kesalahan Blazor WebAssembly memerlukan konfigurasi browser untuk penelusuran kesalahan jarak jauh lalu menyambungkan ke browser menggunakan alat pengembang browser melalui proksi penelusuran kesalahan .NET WebAssembly. Penelusuran kesalahan Firefox dari Visual Studio saat ini tidak didukung.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Kompatibilitas Kebijakan Keamanan Konten (CSP)
Blazor WebAssembly tidak lagi memerlukan pengaktifan unsafe-eval
sumber skrip saat menentukan Kebijakan Keamanan Konten (CSP).
Untuk informasi selengkapnya, lihat Menerapkan Kebijakan Keamanan Konten untuk ASP.NET Core Blazor.
Menangani pengecualian yang tertangkap di luar Razor siklus hidup komponen
Gunakan ComponentBase.DispatchExceptionAsync
dalam komponen untuk memproses pengecualian yang Razor dilemparkan di luar tumpukan panggilan siklus hidup komponen. Ini memungkinkan kode komponen untuk memperlakukan pengecualian seolah-olah mereka adalah pengecualian metode siklus hidup. Setelah itu, Blazormekanisme penanganan kesalahan, seperti batas kesalahan, dapat memproses pengecualian.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Mengonfigurasi runtime .NET WebAssembly
Runtime .NET WebAssembly sekarang dapat dikonfigurasi untuk Blazor startup.
Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.
Konfigurasi batas waktu koneksi di HubConnectionBuilder
Solusi sebelumnya untuk mengonfigurasi batas waktu koneksi hub dapat diganti dengan konfigurasi batas waktu pembangun koneksi hub formal SignalR .
Untuk mengetahui informasi selengkapnya, lihat tautan berikut:
- panduan ASP.NET Core BlazorSignalR
- Menghosting dan menyebarkan ASP.NET Core Blazor WebAssembly
- Menghosting dan menyebarkan aplikasi sisi Blazor server ASP.NET Core
Templat proyek shed Open Iconic
Templat Blazor proyek tidak lagi bergantung pada Open Iconic untuk ikon.
Dukungan untuk dialog batalkan dan tutup peristiwa
Blazor sekarang mendukung cancel
peristiwa dan close
pada dialog
elemen HTML.
Dalam contoh berikut:
-
OnClose
dipanggil saatmy-dialog
dialog ditutup dengan tombol Tutup . -
OnCancel
dipanggil ketika dialog dibatalkan dengan kunci Esc . Saat dialog HTML diberhentikan dengan kunci Esc , peristiwacancel
danclose
dipicu.
<div>
<p>Output: @message</p>
<button onclick="document.getElementById('my-dialog').showModal()">
Show modal dialog
</button>
<dialog id="my-dialog" @onclose="OnClose" @oncancel="OnCancel">
<p>Hi there!</p>
<form method="dialog">
<button>Close</button>
</form>
</dialog>
</div>
@code {
private string? message;
private void OnClose(EventArgs e) => message += "onclose, ";
private void OnCancel(EventArgs e) => message += "oncancel, ";
}
Blazor Identity UI
Blazormendukung pembuatan UI berbasis Blazor penuh Identitysaat Anda memilih opsi autentikasi untuk Akun Individual. Anda dapat memilih opsi untuk Akun Individual dalam dialog proyek baru untuk Blazor Web Appdari Visual Studio atau meneruskan opsi yang -au|--auth
diatur ke Individual
dari baris perintah saat Anda membuat proyek baru.
Untuk informasi selengkapnya, lihat sumber daya berikut:
- ASP.NET Core Blazor autentikasi dan otorisasi
- Pembaruan terbaru tentang autentikasi di .NET 8 (artikel blog)
Amankan Blazor WebAssembly dengan ASP.NET Core Identity
Dokumentasi menghosting Blazor artikel baru dan aplikasi sampel untuk mencakup pengamanan aplikasi mandiri Blazor WebAssembly dengan ASP.NET Core Identity.
Untuk informasi selengkapnya, lihat sumber daya berikut:
- Mengamankan ASP.NET Core Blazor WebAssembly dengan ASP.NET Core Identity
- Pembaruan terbaru tentang autentikasi di .NET 8 (artikel blog)
Blazor Server dengan perutean Yarp
Perutean dan penautan mendalam untuk Blazor Server dengan Yarp berfungsi dengan benar di .NET 8.
Untuk informasi selengkapnya, lihat Migrasi dari ASP.NET Core 7.0 ke 8.0.
Beberapa Blazor Web Apps per proyek server
Dukungan untuk beberapa Blazor Web Apps per proyek server akan dipertimbangkan untuk .NET 10 (November, 2025).
Untuk informasi selengkapnya, lihat Dukungan untuk beberapa Blazor aplikasi Web per proyek server (dotnet/aspnetcore
#52216).
Blazor Hybrid
Artikel berikut ini mendokumen perubahan untuk Blazor Hybrid di .NET 8:
- Memecahkan masalah ASP.NET Core Blazor Hybrid: Artikel baru menjelaskan cara menggunakan BlazorWebView pengelogan.
- .NET MAUI Blazor Hybrid
-
Blazor Hybrid
Ini memungkinkan kode dari UI asli untuk mengakses layanan terlingkup seperti
NavigationManager
. - Blazor Hybrid.
[Parameter]
atribut tidak lagi diperlukan saat disediakan dari string kueri
Atribut [Parameter]
tidak lagi diperlukan saat menyediakan parameter dari string kueri:
- [Parameter]
[SupplyParameterFromQuery]
SignalR
Pendekatan baru untuk mengatur batas waktu server dan interval Keep-Alive
ServerTimeout (default: 30 detik) dan KeepAliveInterval (default: 15 detik) dapat diatur langsung pada HubConnectionBuilder.
Pendekatan sebelumnya untuk klien JavaScript
Contoh berikut menunjukkan penetapan nilai yang menggandakan nilai default di ASP.NET Core 7.0 atau yang lebih lama:
var connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.build();
connection.serverTimeoutInMilliseconds = 60000;
connection.keepAliveIntervalInMilliseconds = 30000;
Pendekatan baru untuk klien JavaScript
Contoh berikut menunjukkan pendekatan baru untuk menetapkan nilai yang menggandakan nilai default di ASP.NET Core 8.0 atau yang lebih baru:
var connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.withServerTimeout(60000)
.withKeepAlive(30000)
.build();
Pendekatan sebelumnya untuk klien JavaScript aplikasi Blazor Server
Contoh berikut menunjukkan penetapan nilai yang menggandakan nilai default di ASP.NET Core 7.0 atau yang lebih lama:
Blazor.start({
configureSignalR: function (builder) {
let c = builder.build();
c.serverTimeoutInMilliseconds = 60000;
c.keepAliveIntervalInMilliseconds = 30000;
builder.build = () => {
return c;
};
}
});
Pendekatan baru untuk klien JavaScript dari aplikasi sisi Blazor server
Contoh berikut menunjukkan pendekatan baru untuk menetapkan nilai yang menggandakan nilai default di ASP.NET Core 8.0 atau yang lebih baru untuk Blazor Web Apps dan Blazor Server.
Blazor Web App:
Blazor.start({
circuit: {
configureSignalR: function (builder) {
builder.withServerTimeout(60000).withKeepAliveInterval(30000);
}
}
});
Blazor Server:
Blazor.start({
configureSignalR: function (builder) {
builder.withServerTimeout(60000).withKeepAliveInterval(30000);
}
});
Pendekatan sebelumnya untuk klien .NET
Contoh berikut menunjukkan penetapan nilai yang menggandakan nilai default di ASP.NET Core 7.0 atau yang lebih lama:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.Build();
builder.ServerTimeout = TimeSpan.FromSeconds(60);
builder.KeepAliveInterval = TimeSpan.FromSeconds(30);
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
Pendekatan baru untuk klien .NET
Contoh berikut menunjukkan pendekatan baru untuk menetapkan nilai yang menggandakan nilai default di ASP.NET Core 8.0 atau yang lebih baru:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.WithServerTimeout(TimeSpan.FromSeconds(60))
.WithKeepAliveInterval(TimeSpan.FromSeconds(30))
.Build();
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
SignalR menyambungkan kembali stateful
SignalR koneksi ulang stateful mengurangi waktu henti klien yang dirasakan yang memiliki pemutusan sementara dalam koneksi jaringan mereka, seperti saat beralih koneksi jaringan atau kehilangan akses sementara yang singkat.
Koneksi ulang stateful mencapai ini dengan:
- Sementara data buffering di server dan klien.
- Mengakui pesan yang diterima (ACK-ing) oleh server dan klien.
- Mengenali kapan koneksi mengembalikan dan memutar ulang pesan yang mungkin telah dikirim saat koneksi tidak berfungsi.
Koneksi ulang stateful tersedia di ASP.NET Core 8.0 dan yang lebih baru.
Ikut serta untuk menyambungkan kembali stateful di titik akhir hub server dan klien:
Perbarui konfigurasi titik akhir hub server untuk mengaktifkan
AllowStatefulReconnects
opsi:app.MapHub<MyHub>("/hubName", options => { options.AllowStatefulReconnects = true; });
Secara opsional, ukuran buffer maksimum dalam byte yang diizinkan oleh server dapat diatur secara global atau untuk hub tertentu dengan
StatefulReconnectBufferSize
opsi :Opsi
StatefulReconnectBufferSize
diatur secara global:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
Opsi
StatefulReconnectBufferSize
yang diatur untuk hub tertentu:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
Opsi
StatefulReconnectBufferSize
ini bersifat opsional dengan default 100.000 byte.Perbarui kode klien JavaScript atau TypeScript untuk mengaktifkan
withStatefulReconnect
opsi:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();
Opsi
bufferSize
ini bersifat opsional dengan default 100.000 byte.Perbarui kode klien .NET untuk mengaktifkan
WithStatefulReconnect
opsi:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();
Opsi
StatefulReconnectBufferSize
ini bersifat opsional dengan default 100.000 byte.
Untuk informasi selengkapnya, lihat Mengonfigurasi koneksi ulang stateful.
Minimal API
Bagian ini menjelaskan fitur baru untuk API minimal. Lihat juga bagian tentang AOT Asli untuk informasi selengkapnya yang relevan dengan API minimal.
Kultur penimpaan pengguna
Mulai ASP.NET Core 8.0, properti RequestLocalizationOptions.CultureInfoUseUserOverride Ini tidak berdampak pada Linux. Ini secara langsung sesuai dengan UseUserOverride.
app.UseRequestLocalization(options =>
{
options.CultureInfoUseUserOverride = false;
});
Pengikatan ke formulir
Pengikatan eksplisit untuk membentuk nilai menggunakan atribut [FromForm] sekarang didukung. Parameter yang terikat pada permintaan dengan [FromForm]
menyertakan token antiforgery. Token antiforgery divalidasi ketika permintaan diproses.
Pengikatan yang disimpulkan ke formulir menggunakan IFormCollectionjenis , IFormFile, dan IFormFileCollection juga didukung. Metadata OpenAPI disimpulkan untuk parameter formulir untuk mendukung integrasi dengan antarmuka pengguna Swagger.
Untuk informasi selengkapnya, lihat:
- Pengikatan eksplisit dari nilai formulir.
- Pengikatan ke formulir dengan IFormCollection, IFormFile, dan IFormFileCollection.
- Pengikatan formulir dalam API minimal
Pengikatan dari formulir sekarang didukung untuk:
Untuk informasi selengkapnya, lihat Mengikat ke koleksi dan jenis kompleks dari formulir.
Antiforgery dengan API minimal
Rilis ini menambahkan middleware untuk memvalidasi token antiforgery, yang digunakan untuk mengurangi serangan pemalsuan permintaan lintas situs. Panggil AddAntiforgery untuk mendaftarkan layanan antiforgery di DI.
WebApplicationBuilder
secara otomatis menambahkan middleware ketika layanan antiforgery telah terdaftar dalam kontainer DI. Token antiforgery digunakan untuk mengurangi serangan pemalsuan permintaan lintas situs.
var builder = WebApplication.CreateBuilder();
builder.Services.AddAntiforgery();
var app = builder.Build();
app.UseAntiforgery();
app.MapGet("/", () => "Hello World!");
app.Run();
Middleware antiforgery:
- Apakah tidak menghentikan eksekusi sisa alur permintaan.
- Mengatur
IAntiforgeryValidationFeature di HttpContext.Features dari permintaan saat ini.
Token antiforgery hanya divalidasi jika:
- Titik akhir berisi metadata yang mengimplementasikan IAntiforgeryMetadata di mana
RequiresValidation=true
. - Metode HTTP yang terkait dengan titik akhir adalah metode HTTP yang relevan. Metode yang relevan adalah semua metode HTTP kecuali untuk TRACE, OPTIONS, HEAD, dan GET.
- Permintaan dikaitkan dengan titik akhir yang valid.
Untuk informasi selengkapnya, lihat Antiforgery dengan API Minimal.
Antarmuka baru IResettable
di ObjectPool
Microsoft.Extensions.ObjectPool menyediakan dukungan untuk mengumpulkan instans objek dalam memori. Aplikasi dapat menggunakan kumpulan objek jika nilainya mahal untuk dialokasikan atau diinisialisasi.
Dalam rilis ini, kami telah membuat kumpulan objek lebih mudah digunakan dengan menambahkan IResettable antarmuka. Jenis yang dapat digunakan kembali sering kali perlu diatur ulang kembali ke status default di antara penggunaan.
IResettable
jenis secara otomatis diatur ulang ketika dikembalikan ke kumpulan objek.
Untuk informasi selengkapnya, lihat sampel ObjectPool.
AOT Asli
Dukungan untuk .NET native ahead-of-time (AOT) telah ditambahkan. Aplikasi yang diterbitkan menggunakan AOT dapat memiliki performa yang jauh lebih baik: ukuran aplikasi yang lebih kecil, penggunaan memori yang lebih sedikit, dan waktu mulai yang lebih cepat. AOT asli saat ini didukung oleh aplikasi layanan gRPC, API minimal, dan pekerja. Untuk informasi selengkapnya, lihat dukungan ASP.NET Core untuk Native AOT dan Tutorial: Menerbitkan aplikasi ASP.NET Core menggunakan Native AOT. Untuk informasi tentang masalah yang diketahui dengan kompatibilitas AOT Inti dan Asli ASP.NET, lihat Masalah GitHub dotnet/core #8288.
Pustaka dan AOT Asli
Banyak pustaka populer yang digunakan dalam proyek ASP.NET Core saat ini memiliki beberapa masalah kompatibilitas saat digunakan dalam proyek yang menargetkan AOT Asli, seperti:
- Penggunaan refleksi untuk memeriksa dan menemukan jenis.
- Memuat pustaka secara kondisional saat runtime.
- Membuat kode dengan cepat untuk mengimplementasikan fungsionalitas.
Pustaka yang menggunakan fitur dinamis ini perlu diperbarui untuk bekerja dengan AOT Asli. Mereka dapat diperbarui menggunakan alat seperti generator sumber Roslyn.
Penulis pustaka berharap untuk mendukung AOT Asli didorong untuk:
- Baca tentang persyaratan kompatibilitas AOT Asli.
- Siapkan pustaka untuk pemangkasan.
Templat proyek baru
Templat proyek ASP.NET Core Web API (Native AOT) baru (nama webapiaot
pendek) membuat proyek dengan penerbitan AOT diaktifkan. Untuk informasi selengkapnya, lihat Templat API Web (AOT Asli).
Metode baru CreateSlimBuilder
Metode yang CreateSlimBuilder() digunakan dalam templat WEB API (Native AOT) menginisialisasi WebApplicationBuilder dengan fitur minimum ASP.NET Core yang diperlukan untuk menjalankan aplikasi. Metode ini CreateSlimBuilder
mencakup fitur-fitur berikut yang biasanya diperlukan untuk pengalaman pengembangan yang efisien:
- Konfigurasi file JSON untuk
appsettings.json
danappsettings.{EnvironmentName}.json
. - Konfigurasi rahasia pengguna.
- Pengelogan konsol.
- Konfigurasi pengelogan.
Untuk informasi selengkapnya, lihat MetodeCreateSlimBuilder
.
Metode baru CreateEmptyBuilder
Ada metode pabrik baru WebApplicationBuilder lainnya untuk membangun aplikasi kecil yang hanya berisi fitur yang diperlukan: WebApplication.CreateEmptyBuilder(WebApplicationOptions options)
. Ini WebApplicationBuilder
dibuat tanpa perilaku bawaan. Aplikasi yang dibangunnya hanya berisi layanan dan middleware yang dikonfigurasi secara eksplisit.
Berikut adalah contoh penggunaan API ini untuk membuat aplikasi web kecil:
var builder = WebApplication.CreateEmptyBuilder(new WebApplicationOptions());
builder.WebHost.UseKestrelCore();
var app = builder.Build();
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello, World!");
await next(context);
});
Console.WriteLine("Running...");
app.Run();
Menerbitkan kode ini dengan Native AOT menggunakan .NET 8 Preview 7 pada komputer linux-x64 menghasilkan executable asli mandiri sekitar 8,5 MB.
Pengurangan ukuran aplikasi dengan dukungan HTTPS yang dapat dikonfigurasi
Kami telah mengurangi ukuran biner AOT Asli lebih lanjut untuk aplikasi yang tidak memerlukan dukungan HTTPS atau HTTP/3. Tidak menggunakan HTTPS atau HTTP/3 umum untuk aplikasi yang berjalan di belakang proksi penghentian TLS (misalnya, dihosting di Azure). Metode baru WebApplication.CreateSlimBuilder
menghilangkan fungsionalitas ini secara default. Ini dapat ditambahkan dengan memanggil builder.WebHost.UseKestrelHttpsConfiguration()
HTTPS atau builder.WebHost.UseQuic()
untuk HTTP/3. Untuk informasi selengkapnya, lihat MetodeCreateSlimBuilder
.
Serialisasi JSON dari jenis yang dihasilkan IAsyncEnumerable<T>
kompilator
Fitur baru ditambahkan ke untuk System.Text.Json mendukung AOT Asli dengan lebih baik. Fitur baru ini menambahkan kemampuan untuk mode System.Text.Json
pembuatan sumber , karena refleksi tidak didukung oleh AOT.
Salah satu fitur baru adalah dukungan untuk serialisasi JSON implementasi IAsyncEnumerable<T> yang diimplementasikan oleh kompilator C#. Dukungan ini membuka penggunaannya dalam proyek ASP.NET Core yang dikonfigurasi untuk menerbitkan AOT Asli.
API ini berguna dalam skenario di mana handler rute menggunakan yield return
untuk mengembalikan enumerasi secara asinkron. Misalnya, untuk mewujudkan baris dari kueri database. Untuk informasi selengkapnya, lihat Dukungan jenis yang tidak dapat diucapkan dalam pengumuman .NET 8 Preview 4.
Untuk informasi tentang peningkatan lain dalam System.Text.Json
pembuatan sumber, lihat Peningkatan serialisasi di .NET 8.
API tingkat atas yang dianotasi untuk peringatan pemangkasan
Titik masuk utama ke subsistem yang tidak berfungsi dengan andal dengan AOT Asli sekarang dianotasikan. Ketika metode ini dipanggil dari aplikasi dengan AOT Asli diaktifkan, peringatan disediakan. Misalnya, kode berikut menghasilkan peringatan saat pemanggilan AddControllers
karena API ini tidak aman dipangkas dan tidak didukung oleh AOT Asli.
Generator delegasi permintaan
Untuk membuat API Minimal kompatibel dengan Native AOT, kami memperkenalkan Request Delegate Generator (RDG). RDG adalah generator sumber yang melakukan apa yang RequestDelegateFactory dilakukan (RDF). Artinya, ini mengubah berbagai MapGet()
panggilan , MapPost()
, dan seperti itu menjadi RequestDelegate instans yang terkait dengan rute yang ditentukan. Tetapi daripada melakukannya dalam memori dalam aplikasi ketika dimulai, RDG melakukannya pada waktu kompilasi dan menghasilkan kode C# langsung ke dalam proyek. The RDG:
- Menghapus pembuatan runtime kode ini.
- Memastikan bahwa jenis yang digunakan dalam API dapat diaalisis secara statis oleh rantai alat AOT Asli.
- Memastikan bahwa kode yang diperlukan tidak dipangkas.
Kami berupaya memastikan bahwa sebanyak mungkin fitur API Minimal didukung oleh RDG dan dengan demikian kompatibel dengan AOT Asli.
RDG diaktifkan secara otomatis dalam proyek saat penerbitan dengan AOT Asli diaktifkan. RDG dapat diaktifkan secara manual bahkan ketika tidak menggunakan AOT Asli dengan mengatur <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
dalam file proyek. Ini dapat berguna saat awalnya mengevaluasi kesiapan proyek untuk AOT Asli, atau untuk mengurangi waktu mulai aplikasi.
Peningkatan performa menggunakan Interceptors
Generator Delegasi Permintaan menggunakan fitur kompilator pencegat C# 12 baru untuk mendukung mencegat panggilan ke metode PETA API minimal dengan varian yang dihasilkan secara statis pada runtime. Penggunaan pencegat menghasilkan peningkatan performa startup untuk aplikasi yang dikompilasi dengan PublishAot
.
Pencatatan dan penanganan pengecualian dalam API minimal yang dihasilkan waktu kompilasi
API minimal yang dihasilkan pada waktu proses mendukung pengelogan secara otomatis (atau melemparkan pengecualian di lingkungan Pengembangan) saat pengikatan parameter gagal. .NET 8 memperkenalkan dukungan yang sama untuk API yang dihasilkan pada waktu kompilasi melalui Request Delegate Generator (RDG). Untuk informasi selengkapnya, lihat Penanganan pengelogan dan pengecualian dalam API minimal yang dihasilkan waktu kompilasi.
AOT dan System.Text.Json
API minimal dioptimalkan untuk menerima dan mengembalikan payload JSON menggunakan System.Text.Json
, sehingga persyaratan kompatibilitas untuk JSON dan Native AOT juga berlaku. Kompatibilitas AOT asli memerlukan penggunaan System.Text.Json
generator sumber. Semua jenis yang diterima sebagai parameter ke atau dikembalikan dari delegasi permintaan dalam API Minimal harus dikonfigurasi pada JsonSerializerContext
yang terdaftar melalui injeksi dependensi ASP.NET Core, misalnya:
// Register the JSON serializer context with DI
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
...
// Add types used in the minimal API app to source generated JSON serializer content
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Untuk informasi selengkapnya tentang TypeInfoResolverChain API, lihat sumber daya berikut:
- JsonSerializerOptions.TypeInfoResolverChain
- Generator sumber rantai
- Perubahan untuk mendukung pembuatan sumber
Pustaka dan AOT Asli
Banyak pustaka umum yang tersedia untuk proyek ASP.NET Core saat ini memiliki beberapa masalah kompatibilitas jika digunakan dalam proyek yang menargetkan AOT Asli. Pustaka populer sering mengandalkan kemampuan dinamis refleksi .NET untuk memeriksa dan menemukan jenis, memuat pustaka secara kondisional saat runtime, dan menghasilkan kode dengan cepat untuk mengimplementasikan fungsionalitasnya. Pustaka ini perlu diperbarui agar dapat bekerja dengan Native AOT dengan menggunakan alat seperti generator sumber Roslyn.
Penulis pustaka yang ingin mempelajari lebih lanjut tentang menyiapkan pustaka mereka untuk Native AOT didorong untuk memulai dengan menyiapkan pustaka mereka untuk pemangkasan dan mempelajari lebih lanjut tentang persyaratan kompatibilitas AOT Asli.
Kestrel dan server HTTP.sys
Ada beberapa fitur baru untuk Kestrel dan HTTP.sys.
Dukungan untuk pipa bernama di Kestrel
Pipa bernama adalah teknologi populer untuk membangun komunikasi antarproses (IPC) antara aplikasi Windows. Anda sekarang dapat membangun server IPC menggunakan .NET, Kestrel, dan pipa bernama.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenNamedPipe("MyPipeName");
});
Untuk informasi selengkapnya tentang fitur ini dan cara menggunakan .NET dan gRPC untuk membuat server dan klien IPC, lihat Komunikasi antarproses dengan gRPC.
Peningkatan performa pada transportasi pipa bernama
Kami telah meningkatkan performa koneksi pipa yang dinamai. Kestrel's bernama transportasi pipa sekarang menerima koneksi secara paralel, dan menggunakan kembali instans NamedPipeServerStream .
Waktu untuk membuat 100.000 koneksi:
- Sebelum : 5.916 detik
- Setelah : 2,374 detik
Dukungan HTTP/2 melalui TLS (HTTPS) di macOS di Kestrel
.NET 8 menambahkan dukungan untuk Negosiasi Protokol Lapisan Aplikasi (ALPN) ke macOS. ALPN adalah fitur TLS yang digunakan untuk menegosiasikan protokol HTTP mana yang akan digunakan koneksi. Misalnya, ALPN memungkinkan browser dan klien HTTP lainnya untuk meminta koneksi HTTP/2. Fitur ini sangat berguna untuk aplikasi gRPC, yang memerlukan HTTP/2. Untuk informasi selengkapnya, lihat Kestrel web ASP.NET Core.
Pengamatan file sertifikat Kestrel
Sertifikat TLS yang dikonfigurasi berdasarkan jalur sekarang dipantau untuk perubahan ketika reloadOnChange
diteruskan ke KestrelServerOptions.Configure(). Perubahan pada file sertifikat diperlakukan dengan cara yang sama seperti perubahan pada jalur yang dikonfigurasi (yaitu, titik akhir dimuat ulang).
Perhatikan bahwa penghapusan file secara khusus tidak dilacak karena muncul secara sementara dan akan menabrak server jika tidak sementara.
Peringatan ketika protokol HTTP yang ditentukan tidak akan digunakan
Jika TLS dinonaktifkan dan HTTP/1.x tersedia, HTTP/2 dan HTTP/3 akan dinonaktifkan, bahkan jika telah ditentukan. Ini dapat menyebabkan beberapa kejutan buruk, jadi kami telah menambahkan output peringatan untuk memberi tahu Anda ketika itu terjadi.
HTTP_PORTS
dan HTTPS_PORTS
kunci konfigurasi
Aplikasi dan kontainer sering kali hanya diberi port untuk didengarkan, seperti 80, tanpa batasan tambahan seperti host atau jalur.
HTTP_PORTS
dan HTTPS_PORTS
adalah kunci konfigurasi baru yang memungkinkan menentukan port mendengarkan untuk Kestrel server dan HTTP.sys. Ini dapat didefinisikan dengan awalan DOTNET_
variabel lingkungan atau ASPNETCORE_
, atau ditentukan langsung melalui input konfigurasi lain seperti appsettings.json. Masing-masing adalah daftar nilai port yang dibatasi titik koma. Contohnya:
ASPNETCORE_HTTP_PORTS=80;8080
ASPNETCORE_HTTPS_PORTS=443;8081
Ini singkatan dari yang berikut, yang menentukan skema (HTTP atau HTTPS) dan host atau IP apa pun:
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
Untuk informasi selengkapnya, lihat Kestrel web ASP.NET Core dan implementasi server web HTTP.sys di ASP.NET Core.
Nama host SNI di ITlsHandshakeFeature
Nama host untuk Indikasi Nama Server (SNI) sekarang diekspos di properti HostName dari antarmuka ITlsHandshakeFeature.
SNI adalah bagian dari proses jabat tangan TLS. Ini memungkinkan klien untuk menentukan nama host yang mereka coba sambungkan ketika server menghosting beberapa host virtual atau domain. Untuk menyajikan sertifikat keamanan yang benar selama proses jabat tangan, server perlu mengetahui nama host yang dipilih untuk setiap permintaan.
Biasanya nama host hanya ditangani dalam tumpukan TLS dan digunakan untuk memilih sertifikat yang cocok. Tetapi dengan mengeksposnya, komponen lain dalam aplikasi dapat menggunakan informasi tersebut untuk tujuan seperti diagnostik, pembatasan tarif, perutean, dan penagihan.
Mengekspos nama host berguna untuk layanan skala besar yang mengelola ribuan pengikatan SNI. Fitur ini dapat secara signifikan meningkatkan efisiensi debugging selama eskalasi pelanggan. Peningkatan transparansi memungkinkan penyelesaian masalah yang lebih cepat dan keandalan layanan yang ditingkatkan.
Untuk informasi selengkapnya, lihat ITlsHandshakeFeature.HostName.
IHttpSysRequestTimingFeature
[IHttpSysRequestTimingFeature](https://source.dot.net/#Microsoft.AspNetCore.Server.HttpSys/IHttpSysRequestTimingFeature.cs,3c5dc86dc837b1f4) menyediakan informasi waktu terperinci untuk permintaan saat menggunakan [ serverHTTP.sys](xref:fundamentals/servers/httpsys) dan [Hosting dalam proses dengan IIS](xref:host-and-deploy/iis/in-process-hosting?view=aspnetcore-8.0&preserve-view=true#ihsrtf8):- 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 waktunya tidak tersedia untuk permintaan saat ini.
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();
Untuk informasi selengkapnya, lihat Mendapatkan informasi waktu terperinci dengan IHttpSysRequestTimingFeature dan Informasi waktu dan Hosting dalam proses dengan IIS.
HTTP.sys: dukungan keikutsertaan untuk buffer 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 telah ditambahkan ke 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 dapat memiliki lebih dari satu tulisan yang luar biasa sekaligus tidak boleh menggunakan bendera ini. Mengaktifkan bendera ini dapat mengakibatkan penggunaan CPU dan memori yang lebih tinggi oleh HTTP.Sys.
Autentikasi dan otorisasi
ASP.NET Core 8 menambahkan fitur baru ke autentikasi dan otorisasi.
Identity Titik akhir API
MapIdentityApi<TUser>
adalah metode ekstensi baru yang menambahkan dua titik akhir API (/register
dan /login
). Tujuan utamanya MapIdentityApi
adalah untuk memudahkan pengembang menggunakan ASP.NET Core Identity untuk autentikasi di aplikasi atau Blazor aplikasi halaman tunggal (SPA) berbasis JavaScript. Alih-alih menggunakan UI default yang disediakan oleh ASP.NET Core Identity, yang didasarkan pada Razor Pages, MapIdentityApi menambahkan titik akhir JSON API yang lebih cocok untuk aplikasi SPA dan aplikasi nonbrowser. Untuk informasi selengkapnya, lihat Identity Titik akhir API.
IAuthorizationRequirementData
Sebelum ASP.NET Core 8, menambahkan kebijakan otorisasi berparameter ke titik akhir yang diperlukan untuk menerapkan:
-
AuthorizeAttribute
untuk setiap kebijakan. -
AuthorizationPolicyProvider
untuk memproses kebijakan kustom dari kontrak berbasis string. -
AuthorizationRequirement
untuk kebijakan tersebut. -
AuthorizationHandler
untuk setiap persyaratan.
Misalnya, pertimbangkan sampel berikut yang ditulis untuk ASP.NET Core 7.0:
using AuthRequirementsData.Authorization;
using Microsoft.AspNetCore.Authorization;
var builder = WebApplication.CreateBuilder();
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
builder.Services.AddControllers();
builder.Services.AddSingleton<IAuthorizationPolicyProvider, MinimumAgePolicyProvider>();
builder.Services.AddSingleton<IAuthorizationHandler, MinimumAgeAuthorizationHandler>();
var app = builder.Build();
app.MapControllers();
app.Run();
using Microsoft.AspNetCore.Mvc;
namespace AuthRequirementsData.Controllers;
[ApiController]
[Route("api/[controller]")]
public class GreetingsController : Controller
{
[MinimumAgeAuthorize(16)]
[HttpGet("hello")]
public string Hello() => $"Hello {(HttpContext.User.Identity?.Name ?? "world")}!";
}
using Microsoft.AspNetCore.Authorization;
using System.Globalization;
using System.Security.Claims;
namespace AuthRequirementsData.Authorization;
class MinimumAgeAuthorizationHandler : AuthorizationHandler<MinimumAgeRequirement>
{
private readonly ILogger<MinimumAgeAuthorizationHandler> _logger;
public MinimumAgeAuthorizationHandler(ILogger<MinimumAgeAuthorizationHandler> logger)
{
_logger = logger;
}
// Check whether a given MinimumAgeRequirement is satisfied or not for a particular
// context.
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// Log as a warning so that it's very clear in sample output which authorization
// policies(and requirements/handlers) are in use.
_logger.LogWarning("Evaluating authorization requirement for age >= {age}",
requirement.Age);
// Check the user's age
var dateOfBirthClaim = context.User.FindFirst(c => c.Type ==
ClaimTypes.DateOfBirth);
if (dateOfBirthClaim != null)
{
// If the user has a date of birth claim, check their age
var dateOfBirth = Convert.ToDateTime(dateOfBirthClaim.Value, CultureInfo.InvariantCulture);
var age = DateTime.Now.Year - dateOfBirth.Year;
if (dateOfBirth > DateTime.Now.AddYears(-age))
{
// Adjust age if the user hasn't had a birthday yet this year.
age--;
}
// If the user meets the age criterion, mark the authorization requirement
// succeeded.
if (age >= requirement.Age)
{
_logger.LogInformation("Minimum age authorization requirement {age} satisfied",
requirement.Age);
context.Succeed(requirement);
}
else
{
_logger.LogInformation("Current user's DateOfBirth claim ({dateOfBirth})" +
" does not satisfy the minimum age authorization requirement {age}",
dateOfBirthClaim.Value,
requirement.Age);
}
}
else
{
_logger.LogInformation("No DateOfBirth claim present");
}
return Task.CompletedTask;
}
}
Sampel lengkapnya ada di repositori AspNetCore.Docs.Samples.
ASP.NET Core 8 memperkenalkan IAuthorizationRequirementData antarmuka. Antarmuka IAuthorizationRequirementData
memungkinkan definisi atribut untuk menentukan persyaratan yang terkait dengan kebijakan otorisasi. Menggunakan IAuthorizationRequirementData
, kode kebijakan otorisasi kustom sebelumnya dapat ditulis dengan lebih sedikit baris kode. File yang diperbarui Program.cs
:
using AuthRequirementsData.Authorization;
using Microsoft.AspNetCore.Authorization;
var builder = WebApplication.CreateBuilder();
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
builder.Services.AddControllers();
- builder.Services.AddSingleton<IAuthorizationPolicyProvider, MinimumAgePolicyProvider>();
builder.Services.AddSingleton<IAuthorizationHandler, MinimumAgeAuthorizationHandler>();
var app = builder.Build();
app.MapControllers();
app.Run();
Yang diperbarui MinimumAgeAuthorizationHandler
:
using Microsoft.AspNetCore.Authorization;
using System.Globalization;
using System.Security.Claims;
namespace AuthRequirementsData.Authorization;
- class MinimumAgeAuthorizationHandler : AuthorizationHandler<MinimumAgeRequirement>
+ class MinimumAgeAuthorizationHandler : AuthorizationHandler<MinimumAgeAuthorizeAttribute>
{
private readonly ILogger<MinimumAgeAuthorizationHandler> _logger;
public MinimumAgeAuthorizationHandler(ILogger<MinimumAgeAuthorizationHandler> logger)
{
_logger = logger;
}
// Check whether a given MinimumAgeRequirement is satisfied or not for a particular
// context
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
- MinimumAgeRequirement requirement)
+ MinimumAgeAuthorizeAttribute requirement)
{
// Remaining code omitted for brevity.
Sampel lengkap yang diperbarui dapat ditemukan di sini.
Lihat Kebijakan otorisasi kustom dengan IAuthorizationRequirementData untuk pemeriksaan terperinci sampel baru.
Mengamankan titik akhir UI Swagger
Titik akhir antarmuka pengguna Swagger sekarang dapat diamankan di lingkungan produksi dengan memanggil MapSwagger().RequireAuthorization
. Untuk informasi selengkapnya, lihat Mengamankan titik akhir UI Swagger
Lain-lain
Bagian berikut menjelaskan fitur baru lainnya di ASP.NET Core 8.
Dukungan layanan utama dalam Injeksi Dependensi
Layanan utama mengacu pada mekanisme untuk mendaftarkan dan mengambil layanan Dependency Injection (DI) menggunakan kunci. Layanan dikaitkan dengan kunci dengan memanggil AddKeyedSingleton (atau AddKeyedScoped
atau AddKeyedTransient
) untuk mendaftarkannya. Akses layanan terdaftar dengan menentukan kunci dengan [FromKeyedServices]
atribut . Kode berikut menunjukkan cara menggunakan layanan kunci:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");
builder.Services.AddControllers();
var app = builder.Build();
app.MapGet("/big", ([FromKeyedServices("big")] ICache bigCache) => bigCache.Get("date"));
app.MapGet("/small", ([FromKeyedServices("small")] ICache smallCache) =>
smallCache.Get("date"));
app.MapControllers();
app.Run();
public interface ICache
{
object Get(string key);
}
public class BigCache : ICache
{
public object Get(string key) => $"Resolving {key} from big cache.";
}
public class SmallCache : ICache
{
public object Get(string key) => $"Resolving {key} from small cache.";
}
[ApiController]
[Route("/cache")]
public class CustomServicesApiController : Controller
{
[HttpGet("big-cache")]
public ActionResult<object> GetOk([FromKeyedServices("big")] ICache cache)
{
return cache.Get("data-mvc");
}
}
public class MyHub : Hub
{
public void Method([FromKeyedServices("small")] ICache cache)
{
Console.WriteLine(cache.Get("signalr"));
}
}
Templat proyek Visual Studio untuk aplikasi SPA dengan backend ASP.NET Core
Templat proyek Visual Studio sekarang menjadi cara yang disarankan untuk membuat aplikasi satu halaman (SPAs) yang memiliki backend ASP.NET Core. Templat disediakan yang membuat aplikasi berdasarkan kerangka kerja JavaScript Angular, React, dan Vue. Templat ini:
- Buat solusi Visual Studio dengan proyek frontend dan proyek backend.
- Gunakan jenis proyek Visual Studio untuk JavaScript dan TypeScript (.esproj) untuk frontend.
- Gunakan proyek ASP.NET Core untuk backend.
Untuk informasi selengkapnya tentang templat Visual Studio dan cara mengakses templat warisan, lihat Gambaran Umum Aplikasi Halaman Tunggal (SPAs) di ASP.NET Core
Dukungan untuk atribut generik
Atribut yang sebelumnya memerlukan Type parameter sekarang tersedia dalam varian generik yang lebih bersih. Hal ini dimungkinkan dengan dukungan untuk atribut generik di C# 11. Misalnya, sintaks untuk menganotasi jenis respons tindakan dapat dimodifikasi sebagai berikut:
[ApiController]
[Route("api/[controller]")]
public class TodosController : Controller
{
[HttpGet("/")]
- [ProducesResponseType(typeof(Todo), StatusCodes.Status200OK)]
+ [ProducesResponseType<Todo>(StatusCodes.Status200OK)]
public Todo Get() => new Todo(1, "Write a sample", DateTime.Now, false);
}
Varian generik didukung untuk atribut berikut:
[ProducesResponseType<T>]
[Produces<T>]
[MiddlewareFilter<T>]
[ModelBinder<T>]
[ModelMetadataType<T>]
[ServiceFilter<T>]
[TypeFilter<T>]
Analisis kode di aplikasi ASP.NET Core
Penganalisis baru yang ditampilkan dalam tabel berikut ini tersedia di ASP.NET Core 8.0.
ID diagnostik | Melanggar atau tidak terputus | Deskripsi |
---|---|---|
ASP0016 | Non-pemisahan | Jangan mengembalikan nilai dari RequestDelegate |
ASP0019 | Non-pemisahan | Sarankan menggunakan IHeaderDictionary.Append atau pengindeks |
ASP0020 | Non-pemisahan | Jenis kompleks yang dirujuk oleh parameter rute harus dapat diurai |
ASP0021 | Non-pemisahan | Jenis pengembalian metode BindAsync harus ValueTask<T> |
ASP0022 | Non-pemisahan | Konflik rute terdeteksi antara penangan rute |
ASP0023 | Non-pemisahan | MVC: Konflik rute terdeteksi antara handler rute |
ASP0024 | Non-pemisahan | Handler rute memiliki beberapa parameter dengan [FromBody] atribut |
ASP0025 | Non-pemisahan | Menggunakan AddAuthorizationBuilder |
Alat rute
ASP.NET Core dibangun pada perutean. API Minimal, API Web, Razor Halaman, dan Blazor semua menggunakan rute untuk menyesuaikan bagaimana permintaan HTTP dipetakan ke kode.
Di .NET 8 kami telah berinvestasi dalam serangkaian fitur baru untuk membuat perutean lebih mudah dipelajari dan digunakan. Fitur-fitur baru ini meliputi:
- Penyorotan sintaks rute
- Pelengkapan otomatis parameter dan nama rute
- Pelengkapan otomatis batasan rute
- Penganalisis dan perbaikan rute
- Dukungan untuk API Minimal, API Web, dan Blazor
Untuk informasi selengkapnya, lihat Alat rute di .NET 8.
metrik ASP.NET Core
Metrik adalah pengukuran yang dilaporkan dari waktu ke waktu dan paling sering digunakan untuk memantau kesehatan aplikasi dan untuk menghasilkan pemberitahuan. Misalnya, penghitung yang melaporkan permintaan HTTP yang gagal dapat ditampilkan di dasbor atau menghasilkan pemberitahuan saat kegagalan melewati ambang batas.
Pratinjau ini menambahkan metrik baru di seluruh ASP.NET Core menggunakan System.Diagnostics.Metrics.
Metrics
adalah API modern untuk melaporkan dan mengumpulkan informasi tentang aplikasi.
Metrik menawarkan banyak peningkatan dibandingkan dengan penghitung peristiwa yang ada:
- Jenis pengukuran baru dengan penghitung, pengukur, dan histogram.
- Pelaporan yang kuat dengan nilai multi-dimensi.
- Integrasi ke ekosistem asli cloud yang lebih luas dengan menyelaraskan dengan standar OpenTelemetry.
Metrik telah ditambahkan untuk hosting ASP.NET Core, Kestrel, dan SignalR. Untuk informasi selengkapnya, lihat System.Diagnostics.Metrics.
IExceptionHandler
IExceptionHandler adalah antarmuka baru yang memberi pengembang panggilan balik untuk menangani pengecualian yang diketahui di lokasi pusat.
IExceptionHandler
implementasi didaftarkan dengan memanggil IServiceCollection.AddExceptionHandler<T>
. Beberapa implementasi dapat ditambahkan, dan dipanggil dalam urutan terdaftar. Jika handler pengecualian menangani permintaan, handler tersebut dapat kembali true
berhenti memproses. Jika pengecualian tidak ditangani oleh handler pengecualian apa pun, kontrol akan kembali ke perilaku dan opsi default dari middleware.
Untuk informasi selengkapnya, lihat IExceptionHandler.
Pengalaman penelusuran kesalahan yang ditingkatkan
Atribut kustomisasi debug telah ditambahkan ke jenis seperti HttpContext
, , HttpRequest
HttpResponse
, ClaimsPrincipal
, dan WebApplication
. Debugger yang ditingkatkan ditampilkan untuk jenis ini membuat menemukan informasi penting lebih mudah dalam debugger IDE. Cuplikan layar berikut menunjukkan perbedaan yang dibuat atribut ini dalam tampilan debugger .HttpContext
.NET 7:
.NET 8:
Tampilan debugger untuk WebApplication
menyoroti informasi penting seperti titik akhir, middleware, dan IConfiguration
nilai yang dikonfigurasi.
.NET 7:
.NET 8:
Untuk informasi selengkapnya tentang penyempurnaan penelusuran kesalahan di .NET 8, lihat:
IPNetwork.Parse
dan TryParse
Metode baru Parse dan TryParse pada IPNetwork menambahkan dukungan untuk membuat IPNetwork
dengan menggunakan string input dalam notasi CIDR atau "notasi garis miring".
Berikut adalah contoh IPv4:
// Using Parse
var network = IPNetwork.Parse("192.168.0.1/32");
// Using TryParse
bool success = IPNetwork.TryParse("192.168.0.1/32", out var network);
// Constructor equivalent
var network = new IPNetwork(IPAddress.Parse("192.168.0.1"), 32);
Dan berikut adalah contoh untuk IPv6:
// Using Parse
var network = IPNetwork.Parse("2001:db8:3c4d::1/128");
// Using TryParse
bool success = IPNetwork.TryParse("2001:db8:3c4d::1/128", out var network);
// Constructor equivalent
var network = new IPNetwork(IPAddress.Parse("2001:db8:3c4d::1"), 128);
Penembolokan output berbasis Redis
ASP.NET Core 8 menambahkan dukungan untuk menggunakan Redis sebagai cache terdistribusi untuk penembolokan output. Penembolokan output adalah fitur yang memungkinkan aplikasi untuk menyimpan output titik akhir API minimal, tindakan pengontrol, atau Razor Halaman. Untuk informasi selengkapnya, lihat Penembolokan output.
Middleware sirkuit pendek setelah perutean
Saat pengaturan rute cocok dengan titik akhir, biasanya mengizinkan seluruh sisa alur middleware untuk berjalan sebelum memanggil logika titik akhir. Layanan dapat mengurangi penggunaan sumber daya dengan memfilter permintaan yang diketahui di awal alur.
ShortCircuit Gunakan metode ekstensi untuk menyebabkan perutean segera memanggil logika titik akhir lalu akhiri permintaan. Misalnya, rute tertentu mungkin tidak perlu melalui autentikasi atau middleware CORS. Contoh permintaan sirkuit pendek berikut yang cocok dengan /short-circuit
rute:
app.MapGet("/short-circuit", () => "Short circuiting!").ShortCircuit();
MapShortCircuit Gunakan metode untuk menyiapkan sirkuit pendek untuk beberapa rute sekaligus, dengan meneruskannya ke sana array param awalan URL. Misalnya, browser dan bot sering memeriksa server untuk jalur terkenal seperti robots.txt
dan favicon.ico
. Jika aplikasi tidak memiliki file tersebut, satu baris kode dapat mengonfigurasi kedua rute:
app.MapShortCircuit(404, "robots.txt", "favicon.ico");
Untuk informasi selengkapnya, lihat Middleware sirkuit pendek setelah perutean.
Ekstensibilitas middleware pengelogan HTTP
Middleware pengelogan HTTP memiliki beberapa kemampuan baru:
- HttpLoggingFields.Duration: Saat diaktifkan, middleware memancarkan log baru di akhir permintaan dan respons yang mengukur total waktu yang diperlukan untuk diproses. Bidang baru ini telah ditambahkan ke HttpLoggingFields.All set.
- HttpLoggingOptions.CombineLogs: Saat diaktifkan, middleware mengonsolidasikan semua log yang diaktifkan untuk permintaan dan respons ke dalam satu log di akhir. Satu pesan log mencakup permintaan, isi permintaan, respons, isi respons, dan durasi.
-
IHttpLoggingInterceptor: Antarmuka baru untuk layanan yang dapat diimplementasikan dan didaftarkan (menggunakan AddHttpLoggingInterceptor) untuk menerima panggilan balik per permintaan dan per respons untuk menyesuaikan detail apa yang dicatat. Setiap pengaturan log khusus titik akhir diterapkan terlebih dahulu dan kemudian dapat ditimpa dalam panggilan balik ini. Implementasi dapat:
- Periksa permintaan dan respons.
- Aktifkan atau nonaktifkan .HttpLoggingFields
- Sesuaikan berapa banyak isi permintaan atau respons yang dicatat.
- Tambahkan bidang kustom ke log.
Untuk informasi selengkapnya, lihat Pengelogan HTTP di .NET Core dan ASP.NET Core.
API baru di ProblemDetails untuk mendukung integrasi yang lebih tangguh
Di .NET 7, layanan ProblemDetails diperkenalkan untuk meningkatkan pengalaman untuk menghasilkan respons kesalahan yang mematuhi spesifikasi ProblemDetails. Di .NET 8, API baru ditambahkan untuk mempermudah penerapan perilaku fallback jika IProblemDetailsService tidak dapat menghasilkan ProblemDetails. Contoh berikut mengilustrasikan penggunaan API baru TryWriteAsync :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async httpContext =>
{
var pds = httpContext.RequestServices.GetService<IProblemDetailsService>();
if (pds == null
|| !await pds.TryWriteAsync(new() { HttpContext = httpContext }))
{
// Fallback behavior
await httpContext.Response.WriteAsync("Fallback: An error occurred.");
}
});
});
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
Untuk informasi selengkapnya, lihat Fallback IProblemDetailsService
Sumber Daya Tambahan:
ASP.NET Core