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?
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. –
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'). –
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