访问当前OwinContext

时间:2017-03-24 19:52:19

标签: c# asp.net-web-api2 owin

我正在开发一个OWIN托管的ASP.Net WebApi2微服务。我们使用Autofac作为依赖注入器。

当我的服务被调用时,我可以通过访问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上注册),我必须手工构建所有的RequestMessages。然后将AuthorizationToken设置为RequestMessage很容易。但不使用便利方法,例如httpClient.PostAsJsonAsync()带来了很多工作。

1 个答案:

答案 0 :(得分: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);
    }
}