Bagikan melalui


Akses HttpContext di ASP.NET Core

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 RazorPageModel 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 pada IHttpContextAccessor.
  • 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 RazorPageModel 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 pada IHttpContextAccessor.
  • 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.