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
- 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"];
}
}
- 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
}
}
- 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>();
}
- 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.
- Accès depuis un modèle de page Razor
La classe de base PageModel expose la propriété HttpContext, utilisable directement.
- 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;
}