2014-12-08 5 views
10

Ich brauche eine Möglichkeit, ein Logging-Objekt pro Anfrage zu speichern. Mit HttpContext würde ich das zu den Items Dictionary hinzufügen. Ich möchte HttpContext nicht mitbringen, wenn ich helfen kann. Der folgende Code ist, was ich für einen Unity LifeTimeManager vorschlage, der Objekte in OWINContexts Environment-Eigenschaft speichert, auf die ich mit meiner OWIN-Middleware zugreifen kann.Sollte ich die Umgebung von OwinContext verwenden, um anwendungsspezifische Daten pro Anfrage zu speichern

public class OwinContextLifetimeManager : LifetimeManager 
{ 
    private string key = (new Guid()).ToString(); 
    private IDictionary<string, object> environment; 

    public OwinContextLifetimeManager(IDictionary<string, object> environment) 
    { 
     this.environment = environment; 
    } 

    public override object GetValue() 
    { 
     if (environment != null && environment.ContainsKey(key)) 
      return environment[key]; 
     else 
      return null; 
    } 

    public override void RemoveValue() 
    { 
     if (environment != null) 
      environment.Remove(key); 
    } 

    public override void SetValue(object newValue) 
    { 
     if (environment != null) 
      environment[key] = newValue; 
    } 
} 

Dann kann ich es wie folgt aus meiner Middleware verwenden:

container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment)); 

Es fällt mir ein, dass ich, was ich will Schlüssel mit Ausnahme derjenigen, die bereits reserviert sind durch Owin wählen können. Gibt es einen Grund, warum ich die OwinContext.Environment für diesen Zweck nicht verwenden sollte? Die MSDN-Dokumentation ist vage zu den Best Practices dafür.

Darrel Miller die Antwort hier: How should I store per request data when using OWIN to Self-Host ASP.NET Web API führt mich zu der Ansicht, dass die Eigenschaften Sammlung auf dem Anfrageobjekt den Weg zu gehen ist. Wie kann ich von Middleware auf dieses Objekt zugreifen?

+0

Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+1

Ich weiß, dies ist eine alte Frage, aber ich möchte nur notieren, wo Sie Ihren Schlüssel 'neue Guid()' sollte 'Guid.NewGuid()' sein. 'new Guid()' erstellt jedes Mal eine leere Guid (alle Nullen - 'Guid.Empty'). –

+0

Gut zu wissen. Stellt sich heraus, da es im Kontext der Anfrage gespeichert wird, habe ich nur eine Konstante verwendet, anstatt eine ID zu speichern. – codetoast

Antwort

11

Das OWIN-Umgebungswörterbuch kann verwendet werden, um Daten pro Anfrage zu speichern. Die Eigenschaftensammlung des Anforderungsobjekts kann dazu verwendet werden, dasselbe zu tun.

Der Hauptunterschied besteht darin, dass das OWIN-Umgebungswörterbuch ein OWIN-Konzept ist und auf jede Middleware anwendbar ist, die in einem OWIN-Host ausgeführt wird. Die Eigenschaftensammlung des Anforderungsobjekts ist ein ASP.NET-Web-API-Konzept und gilt nur für dieses spezifische Framework.

BTW, ASP.NET Web API selbst läuft als Middleware in OWIN-Pipeline. Um Ihre Frage zu beantworten, können Sie daher nicht auf die Sammlung der Anforderungseigenschaften der Web-API von Ihrer Middleware aus zugreifen, da sie nur für die Web-API-Middleware (oder dieses spezifische Framework) gilt.

Wenn Sie Ihre übergreifenden Anliegen als OWIN-Middleware schreiben möchten, müssen Sie das OWIN-Umgebungswörterbuch verwenden. Wenn Web-API-Erweiterungspunkte wie ein Filter oder ein Nachrichtenhandler in Ordnung sind, können Sie die Eigenschaftensammlung verwenden.

Offensichtlich gilt alles, was Sie unter Verwendung von Web-API-Erweiterungspunkten schreiben, nur für Web-API, wohingegen OWIN-Middleware für jede Art von App in OWIN-Pipeline anwendbar ist, die Web-API enthält.

+1

Wie ist diese Antwort http://stackoverflow.com/a/28242568/879655? – Calvin

+2

Viel Text, wenig Sinn. Weitere Argumente: Parallelität? HttpContext.Current.Items vs Owin Umwelt Unterschiede? Owin FILO und Wichtigkeit der Registrierung von Middlewares .. Möchten mehr über konkrete Dinge zu hören, anstatt "Web API verwendet" => Wir sollten auch verwenden .. –

Verwandte Themen