将逻辑调用上下文从OWIN管道传递到WebApi控制器
我正在尝试根据Stephen Cleary的post传递关于逻辑调用上下文的上下文信息(使用CallContext.LogicalSetData(CallContextKey, value)
) http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal .html ; 并受到https://github.com/neuecc/OwinRequestScopeContext中代码的启发。
该值将在OWIN管道中可用,但在呼叫进入WebApi控制器时不可用,该值未设置。
我还注意到在控制器中设置断点时,我看不到调用堆栈中的OWIN管道。 显然,ASP.NET正在单独的调用上下文中进行控制器调用。
所以,
-
为什么(以及如何)ASP.NET将调用上下文从OWIN管道隔离到WebApi控制器?
-
如何将上下文数据从Pipeline传递到控制器?
我花了几天的时间才找出为什么CallContext在API控制器中是清楚的,直到我读到这篇文章: http : //www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-在-IIS集成流水线
如果两个中间件在不同的IIS阶段运行,它们将具有不同的CallContext。
如果您在IIS上托管OWIN并希望在所有中间件中使用相同的请求上下文,那么请使用旧的HttpContext.Current
。
我不太确定你将上下文数据从Pipeline传递给控制器是什么意思,但是如果你已经使用了Microsoft.AspNet.Identity ,你可以利用IAppBuilder.CreatePerOwinContext来将你的对象注册到管道。
当我想通过Owin Pipeline将我的上下文对象传递给WebApi控制器时,我会做类似的事情:
startup.cs
//Registration of a delegate factory app.CreatePerOwinContext(Factory.CreateFoo);
factory.cs
//Contextual Object public static Foo CreateFoo(IdentityFactoryOptions options, IOwinContext context) { //Owin Context is available here }
controller.cs
public FooController() { var fooObj= HttpContext.Current.GetOwinContext().Get(); }
希望能帮助到你 !
- 使用HttpRuntime.Cache发布问题
- asp.net MSDeployEnableWebConfigEncryptRule无法加密web.config
- 为什么ASP.NET Identity 2.0使用GUID /字符串作为用户ID?
- 如何在grid.net中触发LinkButton的click事件和在asp.net中显示PopUp窗口
- C#中函数参数的方括号语法?
- 如何从URL或路径数据中获取控制器类型和操作信息?
- ASP.NET MVC – 在Html.ActionLink routeValues中传递模型的麻烦
- 如何在Entity Framework 4.0模型中添加第一个设计器的文件流列?
- 如果用户使用ASP.NET直接在浏览器中访问URL,如何重定向到登录页面