Accès à HttpContext dans ASP.NET Core : bonnes pratiques

Scénarios d'utilisation de HttpContext

  • Dans un contrôleur
  • Dans un midldeware
  • Dans une couche d'accès aux données
  • Dans un thread d'arrière-plan
  • Dans un modèle de page Razor
  • Dans une vue Razor
  1. Accès depuis un contrôleur

Un contrôleur hérite de la classe Controller, qui elle-même hérite de ControllerBase. Cette dernière expose la propriété HttpContext. On peut donc l'utiliser directement.

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private string clientId;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
        clientId = HttpContext.Request.Form["ClientId"];
    }
}
  1. Accès depuis un middleware

Dans un middleware personnalisé, la méthode Invoke reçoit HttpContext comme paramètre.

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        // Traitement avant le middleware suivant
        await _next.Invoke(context);
        // Nettoyage après
    }
}
  1. Accès depuis la couche d'accès aux données

On injecte IHttpContextAccessor dans le constructeur du repository.

public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _contextAccessor;

    public UserRepository(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public void Add(User user)
    {
        string nomUtilisateur = _contextAccessor.HttpContext.User.Identity.Name;
        // Enregistrement en base
    }
}

Enregistrement dans le conteneur DI :

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddHttpContextAccessor();
    services.AddTransient<IUserRepository, UserRepository>();
}
  1. Accès depuis un thread d'arrière-plan

HttpContext n'est pas thread-safe. Pour l'utiliser dans une tâche asycnhrone :

  • Copier les données nécessaires pendant le traitement de la requête.
  • Transmettre ces copies à la tâche d'arrière-plan.
  1. Accès depuis un modèle de page Razor

La classe de base PageModel expose la propriété HttpContext, utilisable directement.

  1. Accès depuis une vue Razor

La propriété Context de RazorPage donne accès à HttpContext.

@{
    ViewData["Title"] = "Accueil";
    var nom = Context.User.Identity.Name;
}

Étiquettes: ASP.NET Core HttpContext IHttpContextAccessor middleware Razor Page

Publié le 30 juillet à 21h44