2017-03-24 52 views
0

我正在使用OWIN托管的ASP.Net WebApi2 Microservice。我们使用Autofac作为依赖注入器。访问当前OwinContext

当我的服务被调用时,我可以通过访问owinContext.Request.User.Identity来获取有关用户的信息。我的问题是,我必须拨打另一个服务并传递用户信息。我必须创建一个包含用户信息的授权令牌,并将该令牌设置为RequestMessage。

我想写一个DelegatingHandler,我可以放在“HttpClient-MessageHandler-Pipline”中。但是在DelegatingHandler.SendAsync()里面,我需要访问当前的OwinContext。

我想过不同的方法。但我真的希望有一些东西更容易,更容易出错(或者一个暗示我怎么能做出这样的做法是可行的方法之一):

  1. 随着Autofac我不能轻易解决圈养依赖性问题:HttpClient的和因此DelegatingHandler被注册为SingleInstance。但OwinContext在LifeTimeScope上注册。所以我不能只将OwinContext注入到DelegatingHandler的构造函数中。
  2. 我可以编写一个Owin-Middleware,将OwinContext设置为一个静态System.Threading.AsyncLocal变量。在DelegatingHandler中,我可以访问该静态变量。但是可变的全局变量对我来说确实是错误的。
  3. 我根本不写一个DelegatingHandler。在我的ServiceRepository中(也可以在LifeTimeScope中注册),我将不得不手动构造所有的RequestMessage。然后,将AuthorizationToken设置到RequestMessage上很容易。但不使用便利方法,例如httpClient.PostAsJsonAsync()带来了很多工作。

回答

0
public class MyHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     return base.SendAsync(request, cancellationToken) 
      .ContinueWith(task => 
       { 
        HttpResponseMessage response = task.Result; 
        IOwinContext owinContext = request.GetOwinContext(); 

        // do something with the response and owinContext 

        return response; 
       }, 
      cancellationToken); 
    } 
} 
+0

感谢您的答复。我编写了以下SendAsync方法: {owl_internal_text_forend = request.GetOwinContext(); var response = await base.SendAsync(request,cancellationToken); var owinContextAfterSend = request.GetOwinContext(); 返回响应; } 不幸的是,owinContextBeforeSend和owinContextAfterSend都是null。 (我需要owinContextBeforeSend。) – kryz

+0

这种方法可能无法工作:有3方参与“SomeClient ---> MyService ---> SomeOtherService”。在“服务器端”有一个DelegatingHandler,即当接收来自SomeClient的调用时,RequestMessage上会有一个OwinContext。但是,我的DelegatingHandler用于“客户端”,即向SomeOtherService发出请求。在“客户端”没有涉及Owin,因此request.GetOwinContext()将返回null。 – kryz

+0

我试过了你的第一个'SendAsync'并且没有得到null owinContexes。你怎么建立欧文?请看http://stackoverflow.com/questions/23252251/asp-net-webapi-owin-why-would-request-getowincontext-return-null;我尝试的项目:https://github.com/petreturcu/CodePractice/tree/master/Practice/Extending WebApi –