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.

Veröffentlicht von Norbert Eder

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen