2014-09-10 5 views
12

MitErste Aktuelle OwinContext ohne Httpcontext mit

HttpContext.Current.GetOwinContext() 

ich den aktuellen OwinContext in Web-Anwendungen empfangen kann.

Mit OwinContext.Set<T> und OwinContext.Get<T> speichere ich Werte, die für eine ganze Anfrage vorhanden sein sollten.

Jetzt habe ich eine Komponente, die in Web-und Konsolen-Anwendungen verwendet werden sollte. In dieser Komponente habe ich derzeit keinen Zugriff auf den HTTP-Kontext.

In der Anwendung verwende ich Threading und Async-Funktionen.

Ich versuchte auch mit der CallContext, aber dies scheint Daten in somescenarios zu verlieren.

Wie könnte ich auf den aktuellen OwinContext zugreifen? Oder gibt es einen anderen Kontext, in dem ich meine Werte spielen kann?

Antwort

4

Ich mache das unten mit einem WebApi AuthorizationFilter, auch sollten Sie in der Lage sein, dies auf einem MVC Controller und WebApi controller context zu tun, wenn Sie Middleware haben, um es zu unterstützen zB app.UseWebApi (app) für WebApi.

Die Komponente muss die Owin-Pipeline unterstützen, ansonsten nicht sicher, wie Sie den Kontext für den richtigen Thread erhalten.

Vielleicht können Sie Ihre eigene

OwinMiddleware

wireup diese Komponente mit der app.Use() in der Owin Start erstellen.

Mehr Infos here

Meine Immobilien Middleware

public class PropertiesMiddleware : OwinMiddleware 
{ 
    Dictionary<string, object> _properties = null; 

    public PropertiesMiddleware(OwinMiddleware next, Dictionary<string, object> properties) 
     : base(next) 
    { 
     _properties = properties; 
    } 

    public async override Task Invoke(IOwinContext context) 
    { 
     if (_properties != null) 
     { 
      foreach (var prop in _properties) 
       if (context.Get<object>(prop.Key) == null) 
       { 
        context.Set<object>(prop.Key, prop.Value); 
       } 
     } 

     await Next.Invoke(context); 
    } 
} 

Owin StartUp Konfiguration

public void Configuration(IAppBuilder app) 
{ 

     var properties = new Dictionary<string, object>(); 
     properties.Add("AppName", AppName); 

     //pass any properties through the Owin context Environment 
     app.Use(typeof(PropertiesMiddleware), new object[] { properties }); 
} 

WebAPI Filter

public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext context, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) 
{ 

     var owinContext = context.Request.GetOwinContext(); 
     var owinEnvVars = owinContext.Environment; 
     var appName = owinEnvVars["AppName"]; 
} 

Glückliche Codierung!

Verwandte Themen