问题
这几天在做公司的外部WebApi网关,由于使用了OAuth2.0,所以不得不使用Owin来部署网关。
而涉及到请求上下文的问题,为了使业务层能获取到请求头的信息,又不与网关耦合,决定把请求信息写到一个访问上下文中。
在传统的Http部署下,这个问题很好解决,我们可以使用HttpContext或者Session。
然而在Owin的Self-Hosting情况下,这两者都无法使用。
虽然可以自己包装一下CallContext来解决这个问题,但不想重复造轮子。
于是在网上检索了一下,找到了很完善的解决方法。记录分享一下。
解决方案
方法一:
使用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,这是GitHub上的一个开源项目,看了下源码,其实就是简单地包装了一下CallContxt 。
在使用前记得先上Nuget安装一下。
1,在Startup中添加,请保持它在最上层以最先激活。
app.UseRequestScopeContext();
2,在程序中加入参数
OwinRequestScopeContext.Current.Items["myclient"] = new Client();
3,然后可以在任何地方调用它了
var currentClient = OwinRequestScopeContext.Current.Items["myclient"] as Client;
参考的StackOverflow源地址:这里。