Bagikan melalui


Akses HttpContext di ASP.NET Core

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 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 9 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 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)

Untuk informasi selengkapnya, lihat IHttpContextAccessor/HttpContext di aplikasi ASP.NET Core Blazor.

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)

Untuk informasi selengkapnya, lihat IHttpContextAccessor/HttpContext di aplikasi ASP.NET Core Blazor.