2015-01-30 17 views
12

nelle applicazioni ASP.NET tradizionali (che uso System.Web), sono in grado di memorizzare nella cache i dati incaching dei dati per ogni richiesta in applicazione Owin

HttpContext.Current.Items 

Ora nel Owin HttpContext non è più disponibile. C'è un modo per fare la stessa cosa in Owin - un statico metodo/proprietà attraverso il quale posso impostare/ottenere per richiesta dati?

Questo question ha fornito alcuni suggerimenti ma non una soluzione esatta nel mio caso.

+0

Molto buona domanda ... –

risposta

16

Infine ho trovato OwinRequestScopeContext. Molto semplice da usare.

Nella classe di avvio:

app.UseRequestScopeContext(); 

allora posso aggiungere per ogni richiesta di cache in questo modo:

OwinRequestScopeContext.Current.Items["myclient"] = new Client(); 

Poi ovunque nel mio codice che posso fare (proprio come HttpContext.Current):

var currentClient = OwinRequestScopeContext.Current.Items["myclient"] as Client; 

Here è il codice sorgente se siete curiosi. Utilizza CallContext.LogicalGetData e LogicalSetData. Qualcuno vede qualche problema con questo approccio dei dati della richiesta di memorizzazione nella cache?

+0

Ho votato questa risposta perché; è un nuovo approccio di cui non ero a conoscenza. Ho sempre usato l'approccio [DalSoft] (http://stackoverflow.com/users/324497/dalsoft). Qualcuno sa la differenza tra i due? Questo approccio sembra più ** globale ** mentre quello di DalSoft sembra un po 'più ** locale **, ma non sono ancora certo della differenza. –

+1

OwinRequestScopeContext.Current è sempre nullo. Per favore aiuto. – Kumar

+0

In startup.cs, chiama app.UseRequestScopeContext() prima di abilitare WebApi - o mettilo in cima. – Calvin

11

Hai solo bisogno di utilizzare OwinContext per questo:

Da middleware:

public class HelloWorldMiddleware : OwinMiddleware 
{ 
    public HelloWorldMiddleware (OwinMiddleware next) : base(next) { } 

    public override async Task Invoke(IOwinContext context) 
    { 
     context.Set("Hello", "World"); 
     await Next.Invoke(context);  
    } 
} 

Da MVC o WebAPI:

Request.GetOwinContext().Get<string>("Hello"); 
Problemi correlati