2014-12-08 14 views
10

Ho bisogno di un modo per memorizzare un oggetto di registrazione per richiesta. Con HttpContext vorrei aggiungere questo agli elementi dizionario. Non voglio portare HttpContext in questo se posso aiutarlo. Il codice seguente è quello che propongo per Unity LifeTimeManager che memorizzerà oggetti nella proprietà Environment di OwinContext, a cui ho accesso con il mio middleware Owin.Devo utilizzare l'ambiente di OwinContext per conservare i dati specifici dell'applicazione per richiesta

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; 
    } 
} 

Allora posso usare in questo modo dal mio middleware:

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

Mi viene da pensare che io possa scegliere ciò che voglio chiave ad eccezione di quelli che già sono riservati per Owin. C'è qualche ragione per cui non dovrei usare OwinContext.Environment per questo scopo? La documentazione MSDN è vaga sulle migliori pratiche di questo.

La risposta di Darrel Miller qui: How should I store per request data when using OWIN to Self-Host ASP.NET Web API mi porta a credere che la raccolta delle proprietà sull'oggetto richiesta sia la strada da percorrere. Come posso accedere a questo oggetto dal middleware?

+0

Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

+1

So che questa è una vecchia domanda, ma mi piacerebbe solo annotare dove si genera la propria chiave 'nuovo Guid()' dovrebbe essere 'Guid.NewGuid()'. 'new Guid()' crea un guid vuoto (tutti gli zeri - 'Guid.Empty') ogni volta. –

+0

Buono a sapersi. Risulta dal momento che lo salva nel contesto della richiesta, ho appena usato una costante invece di salvare un ID. – codetoast

risposta

11

Il dizionario di ambiente OWIN può essere utilizzato per memorizzare dati per richiesta. La raccolta delle proprietà dell'oggetto richiesta può essere utilizzata per fare lo stesso.

La differenza principale è il dizionario di ambiente OWIN è un concetto OWIN ed è applicabile a qualsiasi middleware in esecuzione in un host OWIN. La raccolta delle proprietà dell'oggetto richiesta è un concetto di API Web ASP.NET ed è applicabile solo a quel framework specifico.

BTW, l'API Web ASP.NET viene eseguita come middleware nella pipeline OWIN. Pertanto, per rispondere alla domanda, non è possibile accedere alla raccolta delle proprietà della richiesta di API Web dal middleware poiché è applicabile solo al middleware dell'API Web (o a quel framework specifico).

Se vuoi scrivere le tue preoccupazioni trasversali come middleware OWIN devi usare il dizionario di ambiente OWIN. Se l'estensione dell'API Web punta come un filtro o un gestore di messaggi, è possibile utilizzare la raccolta di proprietà.

Ovviamente, tutto ciò che si scrive sfruttando i punti di estensione API Web è applicabile solo all'API Web mentre il middleware OWIN è applicabile a qualsiasi tipo di app in esecuzione nella pipeline OWIN e che include Web API.

+1

Come è questa risposta http://stackoverflow.com/a/28242568/879655? – Calvin

+2

Molto testo, poco senso. Altri argomenti: concorrenza? HttpContext.Current.Items vs Owin Environment differenze? OWO FILO e l'importanza della registrazione dei middleware. Vogliamo sapere di più sulle cose concrete piuttosto che "usi API Web" => Dovremmo usare anche noi .. –