ASP.NET Core'da erişim HttpContext
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 8 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, 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ıIHttpContextAccessor
bildirir.- BAĞıMLıLıK, DI bağımlılık zincirini çözümleyip bir örneği
UserRepository
oluş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 void
tanı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ın
HttpContext
. 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.razor
diğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerde App
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./HttpContext Razor Blazor 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 HttpContext
InvokeAsync
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ıIHttpContextAccessor
bildirir.- BAĞıMLıLıK, DI bağımlılık zincirini çözümleyip bir örneği
UserRepository
oluş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 void
tanı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ın
HttpContext
. 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 SendEmailCore
HttpContext
geç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.razor
diğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerde App
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./HttpContext Razor Blazor 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ı.
ASP.NET Core