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.

Über den Autor

Norbert Eder

Ich bin ein leidenschaftlicher Softwareentwickler und Fotograf. Mein Wissen und meine Gedanken teile ich nicht nur hier im Blog, sondern auch in Fachartikeln und Büchern.