Passare il contesto della chiamata logica dalla pipeline OWIN al controller WebApi

Sto cercando di passare informazioni contestuali sul contesto della chiamata logica (utilizzando CallContext.LogicalSetData(CallContextKey, value) ) come da post di Stephen Cleary http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal .html ; e ispirato al codice in https://github.com/neuecc/OwinRequestScopeContext .

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 breakpoint 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.

Così,

  • Perché (e in che modo) ASP.NET isola il contesto della chiamata dalla pipeline OWIN al controller WebApi?

  • Come posso passare i dati contestuali da Pipeline al controller?

Mi ci sono voluti diversi giorni per scoprire perché CallContext è chiaro nel controller API, finché non leggo questo articolo: http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in- the-iis-integrato-gasdotto

Se due middleware vengono eseguiti in una fase IIS diversa, avranno CallContext diverso.

Se stai ospitando OWIN su IIS e desideri lo stesso contesto di richiesta in tutti i middleware, utilizza invece il vecchio HttpContext.Current .

Non sono sicuro di cosa intendi passando i dati contestuali da Pipeline al controller ma forse se usi già Microsoft.AspNet.Identity , puoi sfruttare l’utilizzo di IAppBuilder.CreatePerOwinContext per registrare il tuo object nella pipeline.

Io uso qualcosa del genere quando voglio passare il mio object contestuale tramite Owin Pipeline ai controller WebApi:

startup.cs

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

factory.cs

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

controller.cs

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

Spero che sia d’aiuto !