Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Åtkomst
Anmärkning
Det här är inte den senaste versionen av den här artikeln. Den aktuella versionen finns i .NET 10-versionen av den här artikeln.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
HttpContext kapslar in all information om en enskild HTTP-begäran och ett enskilt svar. En HttpContext instans initieras när en HTTP-begäran tas emot. Instansen HttpContext är tillgänglig via middleware och applikationsramverk som Web API-styrenheter, Razor Pages, SignalR, gRPC med mera.
Information om hur du använder HttpContext med en HTTP-begäran och ett HTTP-svar finns i Använda HttpContext i ASP.NET Core.
Åtkomst HttpContext från Razor sidor
Pages RazorPageModel exponerar egenskapen PageModel.HttpContext :
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Samma egenskap kan användas i motsvarande Razor sidvy:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Åtkomst till HttpContext från en Razor vy i MVC
Razor vyer i MVC-mönstret exponerar HttpContext via RazorPage.Context egenskapen i vyn. I följande exempel hämtas det aktuella användarnamnet i en intranätapp med Windows-autentisering:
@{
var username = Context.User.Identity.Name;
// ...
}
Åtkomst HttpContext från en kontrollant
Kontrollanter exponerar ControllerBase.HttpContext egenskapen:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Åtkomst HttpContext från minimala API:er
Om du vill använda HttpContext från minimala API:er lägger du till en HttpContext parameter:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
Åtkomst HttpContext från mellanprogram
Om du vill använda HttpContext från anpassade mellanprogramskomponenter använder du parametern HttpContext som skickas till Invoke metoden eller InvokeAsync :
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
Åtkomst HttpContext från SignalR
Om du vill använda HttpContext från SignalR, anropar du metoden GetHttpContext på Hub.Context.
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
Åtkomst HttpContext från gRPC-metoder
Information om hur du använder HttpContext från gRPC-metoder finns i Lösa HttpContext i gRPC-metoder.
Åtkomst HttpContext från anpassade komponenter
För andra ramverk och anpassade komponenter som kräver åtkomst till HttpContextär den rekommenderade metoden att registrera ett beroende med hjälp av den inbyggda di-containern (Dependency Injection). DI-containern levererar IHttpContextAccessor till alla klasser som deklarerar den som ett beroende i sina konstruktorer:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
I följande exempel:
-
UserRepositorydeklarerar sitt beroende avIHttpContextAccessor. - Beroendet anges när DI löser beroendekedjan och skapar en instans av
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 åtkomst från en bakgrundstråd
HttpContext är inte trådsäkert. Om du läser eller skriver egenskaper på HttpContext utanför bearbetningen av en förfrågan kan det leda till en NullReferenceException.
Anmärkning
Om din app genererar sporadiska NullReferenceException fel granskar du delar av koden som startar bakgrundsbearbetningen eller som fortsätter bearbetningen när en begäran har slutförts. Leta efter misstag, till exempel att definiera en kontrollantmetod som async void.
Så här utför du bakgrundsarbete med HttpContext data på ett säkert sätt:
- Kopiera nödvändiga data under bearbetningen av begäran.
- Överför de kopierade uppgifterna till en bakgrundsuppgift.
- Referera inte till
HttpContextdata i parallella uppgifter. Extrahera de data som behövs från kontexten innan du startar de parallella uppgifterna.
Undvik osäker kod genom att aldrig skicka HttpContext till en metod som utför bakgrundsarbete. Skicka de data som krävs i stället. I följande exempel SendEmail anropar du SendEmailCoreAsync för att börja skicka ett e-postmeddelande. Värdet för X-Correlation-Id-rubriken skickas till SendEmailCoreAsync i stället för HttpContext. Kodkörningen väntar inte på SendEmailCoreAsync att slutföras:
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 i Razor-komponenter (Blazor)
Mer information finns i IHttpContextAccessor/HttpContext i ASP.NET Core-apparBlazor.
HttpContext kapslar in all information om en enskild HTTP-begäran och ett enskilt svar. En HttpContext instans initieras när en HTTP-begäran tas emot. Instansen HttpContext är tillgänglig via middleware och applikationsramverk som Web API-styrenheter, Razor Pages, SignalR, gRPC med mera.
Information om hur du använder HttpContext med en HTTP-begäran och ett HTTP-svar finns i Använda HttpContext i ASP.NET Core.
Åtkomst HttpContext från Razor sidor
Pages RazorPageModel exponerar egenskapen PageModel.HttpContext :
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Samma egenskap kan användas i motsvarande Razor sidvy:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Åtkomst till HttpContext från en Razor vy i MVC
Razor vyer i MVC-mönstret exponerar HttpContext via RazorPage.Context egenskapen i vyn. I följande exempel hämtas det aktuella användarnamnet i en intranätapp med Windows-autentisering:
@{
var username = Context.User.Identity.Name;
// ...
}
Åtkomst HttpContext från en kontrollant
Kontrollanter exponerar ControllerBase.HttpContext egenskapen:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Åtkomst HttpContext från mellanprogram
När du arbetar med anpassade mellanprogramskomponenter skickas HttpContext till Invoke-metoden eller InvokeAsync-metoden:
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
// ...
}
}
Åtkomst HttpContext från anpassade komponenter
För andra ramverk och anpassade komponenter som kräver åtkomst till HttpContextär den rekommenderade metoden att registrera ett beroende med hjälp av den inbyggda di-containern (Dependency Injection). DI-containern levererar IHttpContextAccessor till alla klasser som deklarerar den som ett beroende i sina konstruktorer:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
I följande exempel:
-
UserRepositorydeklarerar sitt beroende avIHttpContextAccessor. - Beroendet anges när DI löser beroendekedjan och skapar en instans av
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 åtkomst från en bakgrundstråd
HttpContext är inte trådsäkert. Om du läser eller skriver egenskaper på HttpContext utanför bearbetningen av en förfrågan kan det leda till en NullReferenceException.
Anmärkning
Om din app genererar sporadiska NullReferenceException fel granskar du delar av koden som startar bakgrundsbearbetningen eller som fortsätter bearbetningen när en begäran har slutförts. Leta efter misstag, till exempel att definiera en kontrollantmetod som async void.
Så här utför du bakgrundsarbete med HttpContext data på ett säkert sätt:
- Kopiera nödvändiga data under bearbetningen av begäran.
- Överför de kopierade uppgifterna till en bakgrundsuppgift.
- Referera inte till
HttpContextdata i parallella uppgifter. Extrahera de data som behövs från kontexten innan du startar de parallella uppgifterna.
För att undvika osäker kod skickar HttpContext du aldrig till en metod som utför bakgrundsarbete. Skicka de data som krävs i stället. I följande exempel SendEmailCore anropas för att börja skicka ett e-postmeddelande.
correlationId skickas till SendEmailCore, inte HttpContext. Kodkörningen väntar inte på SendEmailCore att slutföras:
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 i Razor-komponenter (Blazor)
Mer information finns i IHttpContextAccessor/HttpContext i ASP.NET Core-apparBlazor.
ASP.NET Core