我试图根据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是在一个单独的调用上下文中进行控制器调用。
所以,
发布于 2016-04-23 21:36:23
我花了几天时间才弄明白为什么API控制器中的CallContext是清晰的,直到我读到这篇文章:http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline。
如果两个中间件运行在不同的IIS阶段,它们将具有不同的CallContext。
如果您在IIS上托管OWIN,并且希望在所有中间件中使用相同的请求上下文,那么,请使用旧的HttpContext.Current
。
发布于 2016-03-26 14:31:32
我不太确定您将上下文数据从管道传递到控制器是什么意思,但是如果您已经使用了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>();
}
希望它能帮上忙!
https://stackoverflow.com/questions/29194836
复制相似问题