Aracılığıyla paylaş


ASP.NET Core'da erişim HttpContext

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

HttpContext tek bir HTTP isteği ve yanıtı hakkındaki tüm bilgileri kapsüller. HTTP HttpContext isteği alındığında örnek başlatılır. Örneğe HttpContext Web API denetleyicileri, SayfalarRazor, SignalR gRPC ve daha fazlası gibi ara yazılım ve uygulama çerçeveleri tarafından erişilebilir.

HTTP isteği ve yanıtıyla kullanma HttpContext hakkında bilgi için bkz . ASP.NET Core'da HttpContext kullanma.

Sayfalardan HttpContext Erişim Razor

Razor Pages PageModel özelliği kullanıma PageModel.HttpContext sunar:

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

Aynı özellik ilgili Razor Sayfa Görünümünde kullanılabilir:

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

MVC'de bir HttpContext görünümden erişim Razor

RazorMVC düzenindeki görünümler, görünümdeki HttpContext özelliği aracılığıyla öğesini kullanıma sunarRazorPage.Context. Aşağıdaki örnek, Windows Kimlik Doğrulaması kullanarak intranet uygulamasındaki geçerli kullanıcı adını alır:

@{
    var username = Context.User.Identity.Name;

    // ...
}

Denetleyiciden erişim HttpContext

Denetleyiciler özelliğini kullanıma ControllerBase.HttpContext sunar:

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;

        // ...

        return View();
    }
}

En düşük API'lerden erişim HttpContext

En düşük API'lerden kullanmak HttpContext için bir HttpContext parametre ekleyin:

app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));

Ara yazılımdan erişim HttpContext

Özel ara yazılım bileşenlerinden kullanmak HttpContext için veya HttpContext yöntemine geçirilen parametresini Invoke kullanınInvokeAsync:

public class MyCustomMiddleware
{
    // ...

    public async Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

Erişim HttpContext için SignalR

'den HttpContextkullanmak SignalR için üzerinde yöntemini GetHttpContextçağırınHub.Context:

public class MyHub : Hub
{
    public async Task SendMessage()
    {
        var httpContext = Context.GetHttpContext();

        // ...
    }
}

gRPC yöntemlerinden erişim HttpContext

gRPC yöntemlerinden kullanmak HttpContext için bkzHttpContext çözümleme.

Özel bileşenlerden erişim HttpContext

erişimi gerektiren diğer çerçeve ve özel bileşenler için HttpContextönerilen yaklaşım, yerleşik Bağımlılık Ekleme (DI) kapsayıcısını kullanarak bir bağımlılığı kaydetmektir. DI kapsayıcısı, oluşturucularında IHttpContextAccessor bağımlılık olarak bildiren tüm sınıflara sağlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();

Aşağıdaki örnekte:

  • UserRepository bağımlılığını IHttpContextAccessorbildirir.
  • BAĞıMLıLıK, DI bağımlılık zincirini çözümleyip bir örneği UserRepositoryoluşturduğunda sağlanır.
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 arka plan iş parçacığından erişim

HttpContext iş parçacığı güvenli değildir. bir isteğin işlenmesi dışından HttpContext okuma veya yazma özellikleri bir NullReferenceExceptionile sonuçlanabilir.

Not

Uygulamanız düzensiz NullReferenceException hatalar oluşturuyorsa, kodun arka plan işlemeyi başlatan veya istek tamamlandıktan sonra işlemeye devam eden bölümlerini gözden geçirin. Denetleyici yöntemini olarak async voidtanımlama gibi hataları arayın.

Verilerle HttpContext güvenli bir şekilde arka plan çalışması yapmak için:

  • İstek işleme sırasında gerekli verileri kopyalayın.
  • Kopyalanan verileri bir arka plan görevine geçirin.
  • Paralel görevlerdeki verilere başvurmayınHttpContext. Paralel görevleri başlatmadan önce bağlamdan gereken verileri ayıklayın.

Güvenli olmayan kodu önlemek için arka plan çalışması yapar bir yönteme hiçbir zaman geçiş HttpContext . Bunun yerine gerekli verileri geçirin. Aşağıdaki örnekte, SendEmail e-posta göndermeye başlamak için çağrılar SendEmailCoreAsync yapılır. üst bilgisinin X-Correlation-Id değeri yerine SendEmailCoreAsyncöğesine HttpContext geçirilir. Kod yürütmenin tamamlanmasını beklemez SendEmailCoreAsync :

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 bileşenlerde Razor (Blazor)

IHttpContextAccessor genellikle etkileşimli işlemede kullanılmaktan kaçınılmalıdır çünkü geçerli bir HttpContext her zaman mevcut değildir.

IHttpContextAccessor sunucuda statik olarak işlenen bileşenler için kullanılabilir. Ancak mümkünse bundan kaçınmanızı öneririz.

HttpContext, üst bilgileri veya bileşendeki diğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerdeApp basamaklı parametreComponents/App.razorkullanılabilir. Değer her zaman null etkileşimli işleme içindir.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

öğesinin HttpContext etkileşimli bileşenlerde gerekli olduğu senaryolar için verileri sunucudan kalıcı bileşen durumu aracılığıyla akışla aktarmanızı öneririz. Daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Sunucu tarafı uygulamaların bileşenlerinde doğrudan veya dolaylı olarak kullanmayınIHttpContextAccessor./HttpContextRazorBlazor Blazor uygulamalar ASP.NET Core işlem hattı bağlamının dışında çalışır. HttpContext içinde kullanılabilir IHttpContextAccessorolması garanti edilmez ve HttpContext uygulamayı başlatan Blazor bağlamı tutması garanti edilmez.

İstek durumunu Blazor uygulamaya geçirmek için önerilen yaklaşım, uygulamanın ilk işlemesi sırasında kök bileşen parametrelerinden geçer. Alternatif olarak uygulama, kök bileşenin uygulama genelinde kullanılmak üzere başlatma yaşam döngüsü olayında verileri kapsamlı bir hizmete kopyalayabilir. Daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Sunucu tarafı Blazor güvenliğinin kritik bir yönü, belirli bir bağlantı hattına bağlı olan kullanıcının, bağlantı hattı oluşturulduktan sonra Blazor bir noktada güncelleştirilebilir ancak IHttpContextAccessorgüncelleştirilmeyebilir. Özel hizmetlerle bu durumu ele alma hakkında daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

HttpContext tek bir HTTP isteği ve yanıtı hakkındaki tüm bilgileri kapsüller. HTTP HttpContext isteği alındığında örnek başlatılır. Örneğe HttpContext Web API denetleyicileri, SayfalarRazor, SignalR gRPC ve daha fazlası gibi ara yazılım ve uygulama çerçeveleri tarafından erişilebilir.

HTTP isteği ve yanıtıyla kullanma HttpContext hakkında bilgi için bkz . ASP.NET Core'da HttpContext kullanma.

Sayfalardan HttpContext Erişim Razor

Razor Pages PageModel özelliği kullanıma PageModel.HttpContext sunar:

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

Aynı özellik ilgili Razor Sayfa Görünümünde kullanılabilir:

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

MVC'de bir HttpContext görünümden erişim Razor

RazorMVC düzenindeki görünümler, görünümdeki HttpContext özelliği aracılığıyla öğesini kullanıma sunarRazorPage.Context. Aşağıdaki örnek, Windows Kimlik Doğrulaması kullanarak intranet uygulamasındaki geçerli kullanıcı adını alır:

@{
    var username = Context.User.Identity.Name;

    // ...
}

Denetleyiciden erişim HttpContext

Denetleyiciler özelliğini kullanıma ControllerBase.HttpContext sunar:

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;

        // ...

        return View();
    }
}

Ara yazılımdan erişim HttpContext

Özel ara yazılım bileşenleriyle çalışırken veya HttpContextInvoke yöntemine InvokeAsync geçirilir:

public class MyCustomMiddleware
{
    public Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

Özel bileşenlerden erişim HttpContext

erişimi gerektiren diğer çerçeve ve özel bileşenler için HttpContextönerilen yaklaşım, yerleşik Bağımlılık Ekleme (DI) kapsayıcısını kullanarak bir bağımlılığı kaydetmektir. DI kapsayıcısı, oluşturucularında IHttpContextAccessor bağımlılık olarak bildiren tüm sınıflara sağlar:

public void ConfigureServices(IServiceCollection services)
{
     services.AddControllersWithViews();
     services.AddHttpContextAccessor();
     services.AddTransient<IUserRepository, UserRepository>();
}

Aşağıdaki örnekte:

  • UserRepository bağımlılığını IHttpContextAccessorbildirir.
  • BAĞıMLıLıK, DI bağımlılık zincirini çözümleyip bir örneği UserRepositoryoluşturduğunda sağlanır.
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 arka plan iş parçacığından erişim

HttpContext iş parçacığı güvenli değildir. bir isteğin işlenmesi dışından HttpContext okuma veya yazma özellikleri bir NullReferenceExceptionile sonuçlanabilir.

Not

Uygulamanız düzensiz NullReferenceException hatalar oluşturuyorsa, kodun arka plan işlemeyi başlatan veya istek tamamlandıktan sonra işlemeye devam eden bölümlerini gözden geçirin. Denetleyici yöntemini olarak async voidtanımlama gibi hataları arayın.

Verilerle HttpContext güvenli bir şekilde arka plan çalışması yapmak için:

  • İstek işleme sırasında gerekli verileri kopyalayın.
  • Kopyalanan verileri bir arka plan görevine geçirin.
  • Paralel görevlerdeki verilere başvurmayınHttpContext. Paralel görevleri başlatmadan önce bağlamdan gereken verileri ayıklayın.

Güvenli olmayan kodu önlemek için, arka plan çalışmasını sağlayan bir yönteme hiçbir zaman geçirmeyin HttpContext . Bunun yerine gerekli verileri geçirin. Aşağıdaki örnekte, SendEmailCore e-posta göndermeye başlamak için çağrılır. correlationId, yerine öğesine SendEmailCoreHttpContextgeçirilir. Kod yürütmenin tamamlanmasını beklemez SendEmailCore :

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 bileşenlerde Razor (Blazor)

geçerli bir HttpContext her zaman kullanılamadığından, IHttpContextAccessor genellikle etkileşimli işlemede kaçınılmalıdır.

IHttpContextAccessor sunucuda statik olarak işlenen bileşenler için kullanılabilir. Ancak mümkünse bundan kaçınmanızı öneririz.

HttpContext, üst bilgileri veya bileşendeki diğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerdeApp basamaklı parametreComponents/App.razorkullanılabilir. Değer her zaman null etkileşimli işleme içindir.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

öğesinin HttpContext etkileşimli bileşenlerde gerekli olduğu senaryolar için verileri sunucudan kalıcı bileşen durumu aracılığıyla akışla aktarmanızı öneririz. Daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Sunucu tarafı uygulamaların bileşenlerinde doğrudan veya dolaylı olarak kullanmayınIHttpContextAccessor./HttpContextRazorBlazor Blazor uygulamalar ASP.NET Core işlem hattı bağlamının dışında çalışır. HttpContext içinde kullanılabilir IHttpContextAccessorolması garanti edilmez ve HttpContext uygulamayı başlatan Blazor bağlamı tutması garanti edilmez.

İstek durumunu Blazor uygulamaya geçirmek için önerilen yaklaşım, uygulamanın ilk işlemesi sırasında kök bileşen parametrelerinden geçer. Alternatif olarak uygulama, kök bileşenin uygulama genelinde kullanılmak üzere başlatma yaşam döngüsü olayında verileri kapsamlı bir hizmete kopyalayabilir. Daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Sunucu tarafı Blazor güvenliğinin kritik bir yönü, belirli bir bağlantı hattına bağlı olan kullanıcının, bağlantı hattı oluşturulduktan sonra Blazor bir noktada güncelleştirilebilir ancak IHttpContextAccessorgüncelleştirilmeyebilir. Özel hizmetlerle bu durumu ele alma hakkında daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.