Akses HttpContext
di ASP.NET Core
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
HttpContext merangkum semua informasi tentang permintaan dan respons HTTP individual. Instans HttpContext
diinisialisasi ketika permintaan HTTP diterima. HttpContext
Instans ini dapat diakses oleh middleware dan kerangka kerja aplikasi seperti pengontrol API Web, Razor Pages, SignalR, gRPC, dan banyak lagi.
Untuk informasi tentang menggunakan HttpContext
dengan permintaan dan respons HTTP, lihat Menggunakan HttpContext di ASP.NET Core.
Akses HttpContext
dari Razor Halaman
Halaman Razor PageModel mengekspos PageModel.HttpContext properti:
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Properti yang sama dapat digunakan dalam Tampilan Halaman yang Razor sesuai:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Akses HttpContext
dari Razor tampilan di MVC
Razor tampilan dalam pola MVC mengekspos HttpContext
melalui RazorPage.Context properti pada tampilan. Contoh berikut mengambil nama pengguna saat ini di aplikasi intranet menggunakan Autentikasi Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Akses HttpContext
dari pengontrol
Pengontrol mengekspos ControllerBase.HttpContext properti:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Akses HttpContext
dari API minimal
Untuk menggunakan HttpContext
dari API minimal, tambahkan HttpContext
parameter:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
Akses HttpContext
dari middleware
Untuk menggunakan HttpContext
dari komponen middleware kustom, gunakan parameter yang HttpContext
diteruskan ke Invoke
metode atau InvokeAsync
:
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
Akses HttpContext
dari SignalR
Untuk menggunakan HttpContext
dari SignalR, panggil GetHttpContext metode pada Hub.Context:
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
Akses HttpContext
dari metode gRPC
Untuk menggunakan HttpContext
dari metode gRPC, lihat Menyelesaikan HttpContext
dalam metode gRPC.
Akses HttpContext
dari komponen kustom
Untuk kerangka kerja lain dan komponen kustom yang memerlukan akses ke HttpContext
, pendekatan yang disarankan adalah mendaftarkan dependensi menggunakan kontainer Dependency Injection (DI) bawaan. Kontainer DI memasok IHttpContextAccessor
ke kelas apa pun yang menyatakannya sebagai dependensi dalam konstruktor mereka:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
Dalam contoh berikut:
UserRepository
menyatakan dependensinya padaIHttpContextAccessor
.- Dependensi disediakan ketika DI menyelesaikan rantai dependensi dan membuat instans
UserRepository
.
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor) =>
_httpContextAccessor = httpContextAccessor;
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
// ...
}
}
HttpContext
akses dari utas latar belakang
HttpContext
tidak aman utas. Membaca atau menulis properti di HttpContext
luar pemrosesan permintaan dapat mengakibatkan NullReferenceException.
Catatan
Jika aplikasi Anda menghasilkan kesalahan sporadis NullReferenceException
, tinjau bagian kode yang memulai pemrosesan latar belakang atau yang melanjutkan pemrosesan setelah permintaan selesai. Cari kesalahan, seperti mendefinisikan metode pengontrol sebagai async void
.
Untuk melakukan pekerjaan latar belakang dengan aman dengan HttpContext
data:
- Salin data yang diperlukan selama pemrosesan permintaan.
- Teruskan data yang disalin ke tugas latar belakang.
- Jangan mereferensikan
HttpContext
data dalam tugas paralel. Ekstrak data yang diperlukan dari konteks sebelum memulai tugas paralel.
Untuk menghindari kode yang tidak aman, jangan pernah meneruskan HttpContext
ke metode yang melakukan pekerjaan latar belakang. Teruskan data yang diperlukan sebagai gantinya. Dalam contoh berikut, SendEmail
panggilan SendEmailCoreAsync
untuk mulai mengirim email. Nilai header diteruskan X-Correlation-Id
ke SendEmailCoreAsync
alih-alih HttpContext
. Eksekusi kode tidak menunggu SendEmailCoreAsync
selesai:
public class EmailController : Controller
{
public IActionResult SendEmail(string email)
{
var correlationId = HttpContext.Request.Headers["X-Correlation-Id"].ToString();
_ = SendEmailCoreAsync(correlationId);
return View();
}
private async Task SendEmailCoreAsync(string correlationId)
{
// ...
}
}
IHttpContextAccessor
/HttpContext
dalam Razor komponen (Blazor)
IHttpContextAccessor harus dihindari dengan penyajian interaktif karena tidak tersedia yang valid HttpContext
.
IHttpContextAccessor dapat digunakan untuk komponen yang dirender secara statis di server. Namun, sebaiknya hindari jika memungkinkan.
HttpContext dapat digunakan sebagai parameter kaskading hanya dalam komponen akar yang dirender secara statis untuk tugas umum, seperti memeriksa dan memodifikasi header atau properti lain dalam App
komponen (Components/App.razor
). Nilainya selalu null
untuk penyajian interaktif.
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
Untuk skenario di mana HttpContext diperlukan dalam komponen interaktif, sebaiknya mengalirkan data melalui status komponen persisten dari server. Untuk informasi selengkapnya, lihat Skenario keamanan tambahan ASP.NET Core Blazor sisi server.
Jangan gunakan IHttpContextAccessor/HttpContext secara langsung atau tidak langsung dalam Razor komponen aplikasi sisi Blazor server. Blazor aplikasi berjalan di luar konteks alur ASP.NET Core. HttpContext tidak dijamin tersedia dalam IHttpContextAccessor, dan HttpContext tidak dijamin untuk menyimpan konteks yang memulai Blazor aplikasi.
Pendekatan yang direkomendasikan untuk meneruskan status permintaan ke Blazor aplikasi adalah melalui parameter komponen akar selama penyajian awal aplikasi. Atau, aplikasi dapat menyalin data ke dalam layanan tercakup dalam peristiwa siklus hidup inisialisasi komponen akar untuk digunakan di seluruh aplikasi. Untuk informasi selengkapnya, lihat Skenario keamanan tambahan ASP.NET Core Blazor sisi server.
Aspek penting dari keamanan sisi Blazor server adalah bahwa pengguna yang melekat pada sirkuit tertentu mungkin diperbarui pada beberapa titik setelah Blazor sirkuit dibuat tetapi IHttpContextAccessortidak diperbarui. Untuk informasi selengkapnya tentang mengatasi situasi ini dengan layanan kustom, lihat Skenario keamanan tambahan ASP.NET Core Blazor sisi server.
HttpContext merangkum semua informasi tentang permintaan dan respons HTTP individual. Instans HttpContext
diinisialisasi ketika permintaan HTTP diterima. HttpContext
Instans ini dapat diakses oleh middleware dan kerangka kerja aplikasi seperti pengontrol API Web, Razor Pages, SignalR, gRPC, dan banyak lagi.
Untuk informasi tentang menggunakan HttpContext
dengan permintaan dan respons HTTP, lihat Menggunakan HttpContext di ASP.NET Core.
Akses HttpContext
dari Razor Halaman
Halaman Razor PageModel mengekspos PageModel.HttpContext properti:
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Properti yang sama dapat digunakan dalam Tampilan Halaman yang Razor sesuai:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Akses HttpContext
dari Razor tampilan di MVC
Razor tampilan dalam pola MVC mengekspos HttpContext
melalui RazorPage.Context properti pada tampilan. Contoh berikut mengambil nama pengguna saat ini di aplikasi intranet menggunakan Autentikasi Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Akses HttpContext
dari pengontrol
Pengontrol mengekspos ControllerBase.HttpContext properti:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Akses HttpContext
dari middleware
Saat bekerja dengan komponen middleware kustom, HttpContext
diteruskan ke Invoke
metode atau InvokeAsync
:
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
// ...
}
}
Akses HttpContext
dari komponen kustom
Untuk kerangka kerja lain dan komponen kustom yang memerlukan akses ke HttpContext
, pendekatan yang disarankan adalah mendaftarkan dependensi menggunakan kontainer Dependency Injection (DI) bawaan. Kontainer DI memasok IHttpContextAccessor
ke kelas apa pun yang menyatakannya sebagai dependensi dalam konstruktor mereka:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
Dalam contoh berikut:
UserRepository
menyatakan dependensinya padaIHttpContextAccessor
.- Dependensi disediakan ketika DI menyelesaikan rantai dependensi dan membuat instans
UserRepository
.
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
service.LogAccessRequest(username);
}
}
HttpContext
akses dari utas latar belakang
HttpContext
tidak aman utas. Membaca atau menulis properti di HttpContext
luar pemrosesan permintaan dapat mengakibatkan NullReferenceException.
Catatan
Jika aplikasi Anda menghasilkan kesalahan sporadis NullReferenceException
, tinjau bagian kode yang memulai pemrosesan latar belakang atau yang melanjutkan pemrosesan setelah permintaan selesai. Cari kesalahan, seperti mendefinisikan metode pengontrol sebagai async void
.
Untuk melakukan pekerjaan latar belakang dengan aman dengan HttpContext
data:
- Salin data yang diperlukan selama pemrosesan permintaan.
- Teruskan data yang disalin ke tugas latar belakang.
- Jangan mereferensikan
HttpContext
data dalam tugas paralel. Ekstrak data yang diperlukan dari konteks sebelum memulai tugas paralel.
Untuk menghindari kode yang tidak aman, jangan pernah meneruskan HttpContext
ke metode yang melakukan pekerjaan latar belakang. Teruskan data yang diperlukan sebagai gantinya. Dalam contoh berikut, SendEmailCore
dipanggil untuk mulai mengirim email. diteruskan correlationId
ke SendEmailCore
, bukan HttpContext
. Eksekusi kode tidak menunggu SendEmailCore
selesai:
public class EmailController : Controller
{
public IActionResult SendEmail(string email)
{
var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();
_ = SendEmailCore(correlationId);
return View();
}
private async Task SendEmailCore(string correlationId)
{
// ...
}
}
IHttpContextAccessor
/HttpContext
dalam Razor komponen (Blazor)
IHttpContextAccessor harus dihindari dengan penyajian interaktif karena tidak tersedia yang valid HttpContext
.
IHttpContextAccessor dapat digunakan untuk komponen yang dirender secara statis di server. Namun, sebaiknya hindari jika memungkinkan.
HttpContext dapat digunakan sebagai parameter kaskading hanya dalam komponen akar yang dirender secara statis untuk tugas umum, seperti memeriksa dan memodifikasi header atau properti lain dalam App
komponen (Components/App.razor
). Nilainya selalu null
untuk penyajian interaktif.
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
Untuk skenario di mana HttpContext diperlukan dalam komponen interaktif, sebaiknya mengalirkan data melalui status komponen persisten dari server. Untuk informasi selengkapnya, lihat Skenario keamanan tambahan ASP.NET Core Blazor sisi server.
Jangan gunakan IHttpContextAccessor/HttpContext secara langsung atau tidak langsung dalam Razor komponen aplikasi sisi Blazor server. Blazor aplikasi berjalan di luar konteks alur ASP.NET Core. HttpContext tidak dijamin tersedia dalam IHttpContextAccessor, dan HttpContext tidak dijamin untuk menyimpan konteks yang memulai Blazor aplikasi.
Pendekatan yang direkomendasikan untuk meneruskan status permintaan ke Blazor aplikasi adalah melalui parameter komponen akar selama penyajian awal aplikasi. Atau, aplikasi dapat menyalin data ke dalam layanan tercakup dalam peristiwa siklus hidup inisialisasi komponen akar untuk digunakan di seluruh aplikasi. Untuk informasi selengkapnya, lihat Skenario keamanan tambahan ASP.NET Core Blazor sisi server.
Aspek penting dari keamanan sisi Blazor server adalah bahwa pengguna yang melekat pada sirkuit tertentu mungkin diperbarui pada beberapa titik setelah Blazor sirkuit dibuat tetapi IHttpContextAccessortidak diperbarui. Untuk informasi selengkapnya tentang mengatasi situasi ini dengan layanan kustom, lihat Skenario keamanan tambahan ASP.NET Core Blazor sisi server.
ASP.NET Core