ASP.NET Core'da erişim HttpContext

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, SayfalarSignalR, Razor 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 Razor Erişim HttpContext

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 Razor görünümden erişim HttpContext

RazorMVC düzenindeki görünümler, görünümdeki RazorPage.Context özelliği aracılığıyla öğesini kullanıma sunarHttpContext. 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 InvokeAsync yöntemine geçirilen parametresini Invoke kullanınHttpContext:

public class MyCustomMiddleware
{
    // ...

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

Erişim HttpContext için SignalR

'den SignalRkullanmak HttpContext için üzerinde yöntemini Hub.ContextçağırınGetHttpContext:

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 bkz. gRPC yöntemlerinde çözümlemeHttpContext.

Ö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.

Dekont

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 HttpContextöğesine SendEmailCoreAsync 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 geçerli HttpContext bir kullanılabilir değer olmadığından etkileşimli işlemeden 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 Components/App.razordiğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerdeApp basamaklı parametre olarak kullanı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 . Sunucu tarafı ASP.NET Core Blazor 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 . Sunucu tarafı ASP.NET Core Blazor 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 . Sunucu tarafı ASP.NET Çekirdek Blazor 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, SayfalarSignalR, Razor 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 Razor Erişim HttpContext

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 Razor görünümden erişim HttpContext

RazorMVC düzenindeki görünümler, görünümdeki RazorPage.Context özelliği aracılığıyla öğesini kullanıma sunarHttpContext. 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 HttpContextInvokeAsync yöntemine Invoke 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.

Dekont

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)

IHttpContextAccessor geçerli HttpContext bir kullanılabilir değer olmadığından etkileşimli işlemeden 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 Components/App.razordiğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerdeApp basamaklı parametre olarak kullanı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 . Sunucu tarafı ASP.NET Core Blazor 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 . Sunucu tarafı ASP.NET Core Blazor 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 . Sunucu tarafı ASP.NET Çekirdek Blazor ek güvenlik senaryoları.