2014-10-05 19 views
12

Ho bisogno di eseguire la mia applicazione che fornisce alcuni servizi API Web ASP.NET su entrambe le modalità self host IIS e .NET CLR. Ho sviluppato i miei servizi API Web ASP.NET basati su OWIN e funziona correttamente su entrambi gli host. Per ora ho bisogno di qualcosa di simile:Ottieni il contesto owin corrente in modalità auto host

public class OwinContextInfrastructure 
    { 
     public static IOwinContext Current 
     { 
      get 
      { 
       if (HttpContext.Current != null) 
       { 
        return HttpContext.Current.GetOwinContext(); 
       } 
       else 
       { 
        // What should I do here ? 
        return null; 
       } 
      } 
     } 
    } 

per ottenere attuale contesto Owin ogni volta che ho bisogno nella mia applicazione.

Il mio codice funziona correttamente su IIS, ma cosa devo fare in modalità .NET Self Host?

risposta

2

In primo luogo, devo correggere la mia domanda.

HttpContext.Current è disponibile in applicazioni basate su ASP.NET e pipeline IIS integrata. Ma non possiamo utilizzare questa classe senza asp.net ovunque, anche su pipeline integrata IIS.

Risposta:

1- ovunque sia necessario IOwinContext, hai per farlo, utilizzando l'iniezione di dipendenza, ad esempio mediante iniezione costruttore.

2- Configura tutto in base a Owin, SignalR è solo Owin, ma usa Web Api & owin insieme e usa nancy per le visualizzazioni lato server, se presenti. Invece di scrivere gestori e moduli IIS o ASP.NET, sviluppa owin middleware.

3- Utilizzando Autofac.Owin & AutoFac.WebApi & AutoFac.WebApi.Owin & Autofac.SignalR, è possibile l'installazione di iniezione di dipendenza di lavoro in tutti i middleware Owin che avete nella vostra applicazione.

4- Autofac crea istanze di controller web api, hub signalr e middleware owin e passa l'istanza di IOwinContext alle classi che si desidera utilizzare mediante l'iniezione del costruttore.

I miei test sono ok su Owin IIS/Helios (senza asp.net), Owin SelfHost e persino Owin Test Server.

Questo approccio è simile a asp.net vNext. Puoi facilmente eseguire la migrazione della tua app su asp.net vNext, quando è pronto per la produzione.

+0

Ciao! Devo accedere anche a IOwinContext per un hub SignalR self-hosted ... puoi mostrare il codice che hai usato per favore? Dopo aver letto entrambe le risposte, non sono ancora sicuro di come farlo ... 'Request' è una proprietà di un' System.Web.Mvc.Controller' che non posso usare dal mio hub :( – ibiza

+0

"Autofac.Owin "avvia l'iniezione di dipendenza utilizzando un Oware Middleware, continuerà a passare tutti gli oggetti per richiesta incluso IOwinContext ad altri middleware come Web API e SignalR e altri middleware compresi quelli che sono sviluppati dal tuo, ma ASP.NET MVC non è un middleware compatibile owin Non puoi auto-ospitare ASP.NET MVC, mi confondo con la tua domanda/-: –

+0

Ok, Autofac è per il mocking e il testing, non sono in questo contesto. Speravo che avresti aggiornato la tua risposta con un po 'di codice, grazie comunque – ibiza

15

È possibile utilizzare Request.GetOwinContext() sia per l'hosting Web che per l'auto-hosting. GetOwinContext è un metodo di estensione per HttpRequestMessage ed è definito nell'assembly System.Web.Http.Owin.dll.

UPDATE

ho risposto alla tua domanda originale, che è come ottenere contesto OWIN sia web-hosting e di auto-hosting. Ora, attraverso la tua domanda aggiuntiva nel commento, hai ampliato in modo significativo l'ambito della tua domanda. C'è un problema fondamentale però. IOwinContext non è una cosa OWIN, è una cosa Katana. Non è possibile aspettarsi alcun framework ospitato su OWIN per fornire un contesto sotto forma di IOwinContext. L'API Web ASP.NET funziona, ma non tutte le strutture sono supposte. IOwinContext è un'astrazione sul dizionario di ambiente OWIN e questo dizionario sarà disponibile per qualsiasi middleware OWIN. Tuttavia, lavorando su un framework, non è più possibile accedere direttamente all'ambiente OWIN, ma solo attraverso il modo in cui tale framework specifico ha deciso di esporre il contesto.

Per Nancy, è necessario utilizzare NancyContext per ottenere il dizionario Items e cercare il valore corrispondente alla chiave "OWIN_REQUEST_ENVIRONMENT". Per SignalR, la proprietà Environment di IRequest consente l'accesso all'ambiente OWIN. Una volta che hai l'ambiente OWIN, puoi creare un nuovo OwinContext usando l'ambiente.

+2

Sì, hai ragione, ma per quanto riguarda il segnale r? nancy e così via? Ho bisogno di qualcosa a livello globale per tutti i framework che sono già ospitati su owin. –

+0

Quello che hai detto è giusto, ma ho trovato una soluzione unificata ben progettata. –