将逻辑调用上下文从 OWIN 管道传递到 WebApi 控制器
Passing logical call context from OWIN pipeline to WebApi controller
我正在尝试根据 Stephen Cleary 的 post http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html; and inspired by the code in https://github.com/neuecc/OwinRequestScopeContext.
传递有关逻辑调用上下文的上下文信息(使用 CallContext.LogicalSetData(CallContextKey, value)
)
该值将通过 OWIN 管道可用,但当调用进入 WebApi 控制器时不可用,该值未设置。
我还注意到,在控制器中设置断点时,在调用堆栈中看不到 OWIN 管道。显然,ASP.NET 在单独的调用上下文中进行控制器调用。
所以,
为什么(以及如何)ASP.NET 将调用上下文从 OWIN 管道隔离到 WebApi 控制器?
如何将上下文数据从管道传递到控制器?
我不太确定将上下文数据从管道传递到控制器是什么意思,但也许如果您已经使用 Microsoft.AspNet.Identity,您可以利用IAppBuilder.CreatePerOwinContext 以便将您的对象注册到管道。
当我想通过 Owin 管道将我的上下文对象传递给 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>();
}
希望对您有所帮助!
我花了好几天才弄清楚为什么API控制器中的CallContext是清晰的,直到我读到这篇文章:
http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
如果两个中间件运行在不同的IIS阶段,它们会有不同的CallContext。
如果您在 IIS 上托管 OWIN 并希望在所有中间件中使用相同的请求上下文,那么请改用旧的 HttpContext.Current
。
我正在尝试根据 Stephen Cleary 的 post http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html; and inspired by the code in https://github.com/neuecc/OwinRequestScopeContext.
传递有关逻辑调用上下文的上下文信息(使用CallContext.LogicalSetData(CallContextKey, value)
)
该值将通过 OWIN 管道可用,但当调用进入 WebApi 控制器时不可用,该值未设置。
我还注意到,在控制器中设置断点时,在调用堆栈中看不到 OWIN 管道。显然,ASP.NET 在单独的调用上下文中进行控制器调用。
所以,
为什么(以及如何)ASP.NET 将调用上下文从 OWIN 管道隔离到 WebApi 控制器?
如何将上下文数据从管道传递到控制器?
我不太确定将上下文数据从管道传递到控制器是什么意思,但也许如果您已经使用 Microsoft.AspNet.Identity,您可以利用IAppBuilder.CreatePerOwinContext 以便将您的对象注册到管道。
当我想通过 Owin 管道将我的上下文对象传递给 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>();
}
希望对您有所帮助!
我花了好几天才弄清楚为什么API控制器中的CallContext是清晰的,直到我读到这篇文章: http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
如果两个中间件运行在不同的IIS阶段,它们会有不同的CallContext。
如果您在 IIS 上托管 OWIN 并希望在所有中间件中使用相同的请求上下文,那么请改用旧的 HttpContext.Current
。