【问题标题】:Access Current OwinContext访问当前的 OwinContext
【发布时间】:2017-03-25 06:22:26
【问题描述】:

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

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

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

我想过不同的方法。但我真的希望有一些更简单、更不容易出错的东西(或者可能提示我如何使这种方法可行):

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

【问题讨论】:

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


    【解决方案1】:
    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);
        }
    }
    

    【讨论】:

    • 感谢您的回复。我写了以下 SendAsync 方法: { var owinContextBeforeSend = request.GetOwinContext(); var response = await base.SendAsync(request, cancelToken); var owinContextAfterSend = request.GetOwinContext();返回响应;不幸的是 owinContextBeforeSend 和 owinContextAfterSend 都是空的。 (而且我需要 owinContextBeforeSend。)
    • 这种方法可能行不通:涉及 3 方“SomeClient ---> MyService ---> SomeOtherService”。在“服务器端”有一个 DelegatingHandler,即当接收来自 SomeClient 的调用时,RequestMessage 上会有一个 OwinContext。但是我的 DelegatingHandler 用于“客户端”,即向 SomeOtherService 发出请求。在“客户端”不涉及 Owin,因此 request.GetOwinContext() 将返回 null。
    • 我已经尝试了你的第一个 SendAsync 并且没有得到 null owinContexes。你是如何设置 Owin 的?请看stackoverflow.com/questions/23252251/…;我尝试过的项目:github.com/petreturcu/CodePractice/tree/master/Practice/…
    • 您发布的链接描述了在我的应用程序的“服务器端”获取 OwinContext 的问题。但这不是我的问题,我不必从传入的 HttpRequestMessage 中获取 OwinContext。我正在处理微服务的“另一端”,我将 HttpRequestMessage 发送到另一个服务。
    猜你喜欢
    • 2014-10-24
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多