2016-08-09 145 views
3

Ist es sicher, eine Instanz von HttpContext in einer Middleware zu speichern?HttpContext .NET Kern speichern Instanz in Middleware

Beispiel:

public class TestMiddleware 
{   
    private readonly RequestDelegate next;  
    private HttpContext context; 
    public TestMiddleware(RequestDelegate next) 
    { 
     this.next = next; 
    } 

    public async Task Invoke(HttpContext context)   
    { 
     try 
     { 
      this.context = context; 

Ich mag es in anderen privaten Methoden verwenden, um daran zu arbeiten, so kann ich es entweder passiere um als Parameter an jene Funktion oder verwenden Sie es wie im Beispiel gezeigt.

Aber ist es threadsicher?

Antwort

6

Aber ist es threadsicher?

Nein, es ist nicht, weil Middleware unbedingt Singletons sind. Wenn Sie ein bestimmtes HttpContext in einem freigegebenen Feld speichern, wird es möglicherweise während einer anderen Anfrage wiederverwendet (was schrecklich wäre).

+0

Was lässt Sie denken, dass "Middlewares notwendigerweise Singletons" sind? – haim770

+0

@ haim770 sie werden während des Starts instanziiert und der Request-Pipeline hinzugefügt, die unveränderlich ist: https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs # L43-L94 – Pinpoint

+0

@ haim770 Wenn Sie mir nicht vertrauen, ist es einfach zu bestätigen: Erstellen Sie eine benutzerdefinierte Middleware und setzen Sie einen Haltepunkt in den Konstruktor. Sie werden sehen, dass es beim Start nur einmal aufgerufen wird. – Pinpoint