Megosztás a következőn keresztül:


Hozzáférés HttpContext a ASP.NET Core-ban

Megjegyzés:

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Figyelmeztetés

A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

HttpContext beágyazza az egyes HTTP-kérésekre és -válaszokra vonatkozó összes információt. Az HttpContext példányt inicializálják, amikor egy HTTP-kérést fogadnak. A HttpContext példány elérhető köztes szoftver- és alkalmazás-keretrendszerek, például webes API-vezérlők, Razor Pages, SignalR gRPC stb.

A HTTP-kérésekkel és -válaszokkal való használatról HttpContext további információt a HttpContext használata a ASP.NET Core-ban című témakörben talál.

Hozzáférés HttpContext lapokról Razor

A Razor Pages PageModel a következő tulajdonságot PageModel.HttpContext teszi elérhetővé:

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

        // ...
    }
}

Ugyanez a tulajdonság használható a megfelelő Razor lapnézetben:

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

Az MVC egy HttpContext nézetéből való hozzáférés Razor-hez

Az MVC-minta nézetei a nézet Razor tulajdonságán keresztül elérhetővé teszik a HttpContext. Az alábbi példa beolvassa az aktuális felhasználónevet egy intranetes alkalmazásban a Windows-hitelesítés használatával:

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

    // ...
}

Hozzáférés HttpContext vezérlőből

A vezérlők elérhetővé teszik a tulajdonságot ControllerBase.HttpContext :

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

        // ...

        return View();
    }
}

Hozzáférés HttpContext minimális API-kból

A minimális API-kon való használathoz adjon hozzá egy HttpContext paramétert:

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

Hozzáférés HttpContext köztes szoftverből

Ha HttpContext szeretné használni egyéni köztes szoftverösszetevőkből, használja a HttpContext paramétert, amelyet átadnak a Invoke vagy InvokeAsync metódushoz.

public class MyCustomMiddleware
{
    // ...

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

Hozzáférés HttpContext -ból/-ből SignalR

A HttpContext forrásból való használathoz hívja meg a SignalR metódust a GetHttpContext következőn:

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

        // ...
    }
}

Hozzáférés HttpContext gRPC-metódusokból

A HttpContext használatához a gRPC-metódusokban lásd: Feloldás HttpContext a gRPC-metódusokban.

Hozzáférés HttpContext egyéni összetevőkből

Más keretrendszerek és egyéni összetevők esetében, amelyekhez HttpContexthozzáférés szükséges, az ajánlott módszer a függőségek regisztrálása a beépített Függőséginjektálási (DI) tárolóval. A DI-tároló azokat az IHttpContextAccessor osztályokat látja el, amelyek függőségként deklarálják azt a konstruktorokban:

var builder = WebApplication.CreateBuilder(args);

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

Az alábbi példában:

  • UserRepository deklarálja a függőségét a IHttpContextAccessor.
  • A függőség akkor lesz megadva, ha a DI feloldja a függőségi láncot, és létrehoz egy példányt.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 hozzáférés háttérszálból

HttpContext nem szálbiztos. A kérés feldolgozásán kívül eső HttpContext tulajdonságok olvasása vagy írása a következőt eredményezheti NullReferenceException: .

Megjegyzés:

Ha az alkalmazás szórványos NullReferenceException hibákat okoz, tekintse át a kód azon részeit, amelyek elindítják a háttérfeldolgozást, vagy amelyek a kérés befejeződése után folytatják a feldolgozást. Keressen hibákat, mint például vezérlőmetódus definiálása async void-ként.

Az adatokkal végzett HttpContext háttérmunka biztonságos végrehajtásához:

  • Másolja ki a szükséges adatokat a kérelem feldolgozása során.
  • Adja át a másolt adatokat egy háttérfeladatnak.
  • Ne hivatkozzon adatokra HttpContext párhuzamos feladatokban. A párhuzamos feladatok megkezdése előtt bontsa ki a környezetből a szükséges adatokat.

A nem biztonságos kód elkerülése érdekében soha ne adjon át HttpContext olyan metódusnak, amelyhez háttérmunka tartozik. Adja át helyette a szükséges adatokat. Az alábbi példában a SendEmail hívja a SendEmailCoreAsync-et, hogy megkezdje egy e-mail küldését. A X-Correlation-Id fejléc értéke a SendEmailCoreAsync-hez van továbbítva ahelyett, hogy a HttpContext-hez. A kód végrehajtása nem vár SendEmailCoreAsync befejezésére.

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 összetevőkben Razor (Blazor)

További információ: IHttpContextAccessor/HttpContext a ASP.NET Core-alkalmazásokbanBlazor.

HttpContext beágyazza az egyes HTTP-kérésekre és -válaszokra vonatkozó összes információt. Az HttpContext példányt inicializálják, amikor egy HTTP-kérést fogadnak. A HttpContext példány elérhető köztes szoftver- és alkalmazás-keretrendszerek, például webes API-vezérlők, Razor Pages, SignalR gRPC stb.

A HTTP-kérésekkel és -válaszokkal való használatról HttpContext további információt a HttpContext használata a ASP.NET Core-ban című témakörben talál.

Hozzáférés HttpContext lapokról Razor

A Razor Pages PageModel a következő tulajdonságot PageModel.HttpContext teszi elérhetővé:

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

        // ...
    }
}

Ugyanez a tulajdonság használható a megfelelő Razor lapnézetben:

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

Az MVC egy HttpContext nézetéből való hozzáférés Razor-hez

Az MVC-minta nézetei a nézet Razor tulajdonságán keresztül elérhetővé teszik a HttpContext. Az alábbi példa beolvassa az aktuális felhasználónevet egy intranetes alkalmazásban a Windows-hitelesítés használatával:

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

    // ...
}

Hozzáférés HttpContext vezérlőből

A vezérlők elérhetővé teszik a tulajdonságot ControllerBase.HttpContext :

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

        // ...

        return View();
    }
}

Hozzáférés HttpContext köztes szoftverből

Egyéni köztes szoftverösszetevők használatakor HttpContext átadásra kerül a Invoke vagy InvokeAsync metódusba.

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

Hozzáférés HttpContext egyéni összetevőkből

Más keretrendszerek és egyéni összetevők esetében, amelyekhez HttpContexthozzáférés szükséges, az ajánlott módszer a függőségek regisztrálása a beépített Függőséginjektálási (DI) tárolóval. A DI-tároló azokat az IHttpContextAccessor osztályokat látja el, amelyek függőségként deklarálják azt a konstruktorokban:

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

Az alábbi példában:

  • UserRepository deklarálja a függőségét a IHttpContextAccessor.
  • A függőség akkor lesz megadva, ha a DI feloldja a függőségi láncot, és létrehoz egy példányt.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 hozzáférés háttérszálból

HttpContext nem szálbiztos. A kérés feldolgozásán kívül eső HttpContext tulajdonságok olvasása vagy írása a következőt eredményezheti NullReferenceException: .

Megjegyzés:

Ha az alkalmazás szórványos NullReferenceException hibákat okoz, tekintse át a kód azon részeit, amelyek elindítják a háttérfeldolgozást, vagy amelyek a kérés befejeződése után folytatják a feldolgozást. Keressen hibákat, mint például vezérlőmetódus definiálása async void-ként.

Az adatokkal végzett HttpContext háttérmunka biztonságos végrehajtásához:

  • Másolja ki a szükséges adatokat a kérelem feldolgozása során.
  • Adja át a másolt adatokat egy háttérfeladatnak.
  • Ne hivatkozzon adatokra HttpContext párhuzamos feladatokban. A párhuzamos feladatok megkezdése előtt bontsa ki a környezetből a szükséges adatokat.

A nem biztonságos kód elkerülése érdekében soha ne adja át a HttpContext egy háttérben dolgozó metódusnak. Adja át helyette a szükséges adatokat. Az alábbi példában SendEmailCore az e-mailek küldésének megkezdésére hívjuk meg. Az correlationId át van adva a SendEmailCore-nak, nem pedig a HttpContext-nak. A kód végrehajtása nem vár SendEmailCore befejezésére.

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 összetevőkben Razor (Blazor)

További információ: IHttpContextAccessor/HttpContext a ASP.NET Core-alkalmazásokbanBlazor.