我试图按照Stephen Cleary的帖子http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html传递关于逻辑调用上下文的上下文信息(使用CallContext.LogicalSetData(CallContextKey, value)
);并受到https://github.com/neuecc/OwinRequestScopeContext中代码的启发。
该值将通过OWIN管道提供,但在呼叫进入WebApi控制器时不可用,该值未设置。
我还注意到在控制器中设置断点时,我无法在调用堆栈中看到OWIN管道。显然,ASP.NET正在一个单独的调用上下文中进行控制器调用。
所以,
为什么(以及如何)ASP.NET将调用上下文从OWIN管道隔离到WebApi控制器?
如何将上下文数据从Pipeline传递到控制器?
答案 0 :(得分:10)
在我阅读本文之前,我花了几天的时间才找出为什么CallContext在API控制器中是清楚的: http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
如果两个中间件在不同的IIS阶段运行,它们将具有不同的CallContext。
如果您在IIS上托管OWIN并希望在所有中间件中使用相同的请求上下文,那么请使用旧版HttpContext.Current
。
答案 1 :(得分:0)
我不确定你将上下文数据从Pipeline传递给控制器是什么意思,但是如果你已经使用 Microsoft.AspNet.Identity ,你可以利用 IAppBuilder .CreatePerOwinContext ,以便将您的对象注册到管道。
当我想通过Owin Pipeline将我的上下文对象传递给WebApi控制器时,我会做类似的事情:
<强> startup.cs 强>
//Registration of a delegate factory
app.CreatePerOwinContext<Foo>(Factory.CreateFoo);
<强> factory.cs 强>
//Contextual Object
public static Foo CreateFoo(IdentityFactoryOptions<Foo> options, IOwinContext context)
{
//Owin Context is available here
}
<强> controller.cs 强>
public FooController()
{
var fooObj= HttpContext.Current.GetOwinContext().Get<Foo>();
}
希望它有所帮助!