在Owin Self-Hosing下实现每个请求中共享上下文(数据)

Posted ShiningRush

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Owin Self-Hosing下实现每个请求中共享上下文(数据)相关的知识,希望对你有一定的参考价值。

问题


 

这几天在做公司的外部WebApi网关,由于使用了OAuth2.0,所以不得不使用Owin来部署网关。

而涉及到请求上下文的问题,为了使逻辑层能获取到请求头的信息,又不与网管耦合,决定把请求信息写到一个访问上下文中。

在传统的Http部署下,这个问题很好解决,我们可以使用HttpContext或者CallContext都是可行的。

然而在Owin的Self-Hosting情况下,这两者都无法使用。

在网上检索了一下,找到了很完善的解决方法。记录分享一下。

 

解决方案


 方法一:

使用OwinContext

在你的中间件中添加如下代码

public class HelloWorldMiddleware : OwinMiddleware
{
   public HelloWorldMiddleware (OwinMiddleware next) : base(next) { }

   public override async Task Invoke(IOwinContext context)
   {   
       context.Set("Hello", "World");
       await Next.Invoke(context);     
   }   
}

在MVC或Webapi中使用:

Request.GetOwinContext().Get<string>("Hello");

 

方法2:

使用 OwinRequestScopeContext 。

1,在Startup中添加,请保持它在最上层以最先激活。

app.UseRequestScopeContext();

2,在程序中加入参数

OwinRequestScopeContext.Current.Items["myclient"] = new Client();

3,然后可以在任何地方调用它了

var currentClient = OwinRequestScopeContext.Current.Items["myclient"] as Client;

 

参考的StackOverflow源地址:这里

 

以上是关于在Owin Self-Hosing下实现每个请求中共享上下文(数据)的主要内容,如果未能解决你的问题,请参考以下文章

Web Api OWIN - 如何在每个请求上验证令牌

请求 OWIN 令牌时出现 CORS 错误

ASP.NET Microsoft OWIN 令牌变得无效

Owin,在Authentication Request中传递自定义查询参数

在我自己的 OWIN 中间件中使用 Ninject DI

owin解决跨域js请求