2015-03-22 17 views
17

Sto provando a passare informazioni contestuali sul contesto della chiamata logica (utilizzando CallContext.LogicalSetData(CallContextKey, value)) come da posta di Stephen Cleary http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html; e ispirato al codice in https://github.com/neuecc/OwinRequestScopeContext.Passaggio del contesto della chiamata logica dalla pipeline OWIN al controller WebApi

Il valore sarà disponibile attraverso la pipeline OWIN, ma non è disponibile quando la chiamata entra nel controller WebApi, il valore non è impostato.

Ho anche notato che quando si imposta un punto di interruzione nel controller, non riesco a vedere la pipeline OWIN nello stack di chiamate. Apparentemente, ASP.NET sta effettuando chiamate di controller su un contesto di chiamata separato.

Quindi,

  • Perché (e come) si fa ASP.NET isolare il contesto chiamata da OWIN pipeline per il controller WebAPI?

  • Come posso passare i dati contestuali dalla pipeline al controller?

risposta

7

Mi ci sono voluti diversi giorni per scoprire perché il CallContext è chiaro nel controller API, fino a quando ho letto questo articolo: http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

Se due middleware viene eseguito in fase differente IIS, avranno CallContext diverso.

Se si ospita OWIN su IIS e si desidera lo stesso contesto di richiesta in tutti i middleware, utilizzare invece il vecchio HttpContext.Current.

0

Io non sono davvero sicuro di cosa si intende per il passaggio di dati contestuali da Pipeline al controller ma forse se si utilizza già Microsoft.AspNet.Identity, si potrebbe sfruttare l'uso di IAppBuilder.CreatePerOwinContext per registrare il tuo oggetto nella pipeline.

che uso per fare qualcosa di simile quando voglio passare il mio oggetto contestuale attraverso Owin Pipeline ai controller WebAPI:

startup.cs

//Registration of a delegate factory 
app.CreatePerOwinContext<Foo>(Factory.CreateFoo); 

factory.cs

//Contextual Object 
public static Foo CreateFoo(IdentityFactoryOptions<Foo> options, IOwinContext context) 
    { 
     //Owin Context is available here 
    } 

controller.cs

public FooController() 
    { 
     var fooObj= HttpContext.Current.GetOwinContext().Get<Foo>(); 
    } 

Spero che sia d'aiuto!

Problemi correlati