In vielen Fällen ist der Zugriff auf den HttpContext
notwendig, sei es nur, um an die aktuellen Benutzerinformationen zu gelangen.
Dies gestaltet sich in einem Controller
sehr einfach, da diese Basisklasse den HttpContext
über eine Eigenschaft nach außen gibt.
public class DemoController : Controller
{
[HttpPut]
public IActionResult Put([FromBody] Audit audit)
{
ClaimsPrincipal principal = this.HttpContext.User;
if (principal.HasClaim(c => c.Type == "id"))
{
audit.ChangedBy = principal.Claims.First(c => c.Type == "userName").Value;
}
else
{
return BadRequest("error message");
}
// code goes here
return Ok();
}
}
Nun kann man diverse Aufgaben in eigenen Komponenten ausführen. Dort ist der HTTP-Kontext nicht verfügbar. Wie kann nun darauf zugegriffen werden?
Die Lösung besteht in der Verwendung des Schnittstelle IHttpContextAccessor
in Verbindung mit der Dependency Injection, die .NET Core bietet:
public void ConfigureServices(IServiceCollection services)
{
// configuration goes here
services.AddHttpContextAccessor();
}
Bei Nutzung der Dependency Injection wird die Abhängigkeit nun bei Klassen, die das Interface IHttpContextAccssor
als Konstruktor-Parameter erwarten, übergeben.
public class Auditor
{
private IHttpContextAccessor ContextAccessor { get; set; }
public Auditor(IHttpContextAccessor httpContextAccessor)
{
ContextAccessor = httpContextAccessor;
}
public void WriteAudit(T oldEntity, T newEntity)
{
var user = ContextAccessor.HttpContext.User;
// code goes here
}
}
Diese Klasse muss natürlich noch beim Dependendy System registriert werden:
public void ConfigureServices(IServiceCollection services)
{
// configuration goes here
services.AddHttpContextAccessor();
services.AddTransient<Auditor>();
}
Happy Coding.
Du willst mehr zu .NET Core erfahren? Hier lang.