在自主机模式下获取当前的 owin 上下文

Posted

技术标签:

【中文标题】在自主机模式下获取当前的 owin 上下文【英文标题】:Get current owin context in self host mode 【发布时间】:2014-11-29 19:34:31 【问题描述】:

我需要运行我的应用程序,该应用程序在 IIS 和 .NET CLR 自托管模式下都提供了一些 ASP.NET Web API 服务。 我基于 OWIN 开发了我的 ASP.NET Web API 服务,它在两台主机上都运行良好。 现在我需要这样的东西:

public class OwinContextInfrastructure
    
        public static IOwinContext Current
        
            get
            
                if (HttpContext.Current != null)
                
                    return HttpContext.Current.GetOwinContext();
                
                else
                
                    // What should I do here ?
                    return null;
                
            
        
    

在我的应用程序中需要时获取当前的 owin 上下文。

我的代码在 IIS 上运行良好,但在 .NET Self Host 模式下我应该怎么做?

【问题讨论】:

【参考方案1】:

您可以将Request.GetOwinContext() 用于网络托管和自托管。 GetOwinContextHttpRequestMessage 的扩展方法,在 System.Web.Http.Owin.dll 程序集中定义。

更新

我已经回答了您最初的问题,即如何在网络托管和自托管中获取 OWIN 上下文。现在,通过您在评论中的附加问题,您已经大大拓宽了您的问题范围。但是有一个根本问题。 IOwinContext 不是 OWIN 的东西,它是 Katana 的东西。您不能指望 OWIN 上托管的任何框架以 IOwinContext 的形式提供上下文。 ASP.NET Web API 可以,但不是每个框架都应该这样做。 IOwinContext 是对 OWIN 环境字典的抽象,该字典可用于任何 OWIN 中间件。但是,通过在框架之上工作,您不再可以直接访问 OWIN 环境,而只能通过该特定框架决定公开上下文的方式来访问。

对于 Nancy,您必须使用 NancyContext 来访问 Items 字典并查找与键“OWIN_REQUEST_ENVIRONMENT”对应的值。对于 SignalR,IRequestEnvironment 属性可让您访问 OWIN 环境。拥有 OWIN 环境后,您可以使用该环境创建一个新的OwinContext

【讨论】:

是的,你是对的,但是信号 r 呢?南希等等?对于已经托管在 owin 上的所有框架,我需要全局性的东西。 你说的对,但我找到了一个设计良好的统一解决方案。【参考方案2】:

首先,我要纠正我的问题。

HttpContext.Current 在基于 ASP.NET 和集成 IIS 管道的应用程序中可用。但是我们无法在任何地方使用没有 asp.net 的此类,即使在 IIS 集成管道上也是如此。

答案:

1- 任何需要 IOwinContext 的地方,都必须使用依赖注入(例如通过构造函数注入)来获取它。

2- 将所有内容配置为基于 Owin 工作,SignalR 仅基于 Owin,但同时使用 Web Api 和 owin,如果有的话,将 nancy 用于服务器端视图。无需编写 IIS 或 ASP.NET 处理程序和模块,而是开发 owin 中间件。

3- 使用 Autofac.Owin & AutoFac.WebApi & AutoFac.WebApi.Owin & Autofac.SignalR,您可以设置在您的应用程序中的所有 owin 中间件上工作的依赖注入。

4- Autofac 将实例化 web api 控制器、信号集线器和 owin 中间件,它会使用构造函数注入将 IOwinContext 实例传递给您想要的类。

我的测试在 Owin IIS/Helios(没有 asp.net)、Owin SelfHost 甚至 Owin Test Server 上都可以。

这种方法类似于asp.net vNext。当您准备好生产时,您可以轻松地将您的应用迁移到 asp.net vNext。

【讨论】:

嗨!我也需要访问自托管 SignalR 集线器的 IOwinContext ......你能显示你使用的有效代码吗?在这里阅读了两个答案后,我仍然不确定该怎么做...RequestSystem.Web.Mvc.Controller 的属性,我不能从我的集线器使用它:( "Autofac.Owin" 使用 Owin 中间件开始依赖注入,它将继续将所有每个请求对象(包括 IOwinContext)传递给其他中间件,如 Web API 和 SignalR 以及其他中间件,包括您开发的中间件,但是 ASP.NET MVC 不是 owin 兼容的中间件,您不能自行托管 ASP.NET MVC,我对您的问题感到困惑 /-: 好吧,Autofac 是用来模拟和测试的,我不在这方面。我希望你能用一些代码更新你的答案,无论如何谢谢 Autofac 是一个依赖注入库,依赖注入在各种场景中都很有用,包括但不限于模拟和测试。 @ulu Autofac-owin 本身有一个中间件。它为每个 Owin 请求创建一个 Autofac 范围,并为该范围注册 IOwinContext。您可以在以 PerScope 模式注册的类中使用依赖注入访问 IOwinContext(它不适用于单例注册) Bit 框架(用于开发 api/mobile/web 应用程序的完整堆栈框架)是一个很好的示例,其中在 asp.net 核心之上配置 Owin,并将其依赖注入扩展到所有 owin/asp.net 核心组件。 docs.bit-framework.com

以上是关于在自主机模式下获取当前的 owin 上下文的主要内容,如果未能解决你的问题,请参考以下文章

在上下文中找不到 owin.Environment 项

当前上下文中不存在名称“trace”

什么方法可以捕获在自定义视图(布局)中选择的上下文菜单项?

如何在自定义用户控件中为 ListBox ItemTemplate 属性设置适当的上下文

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

在使用 Owin 自托管的 Web API 中获取远程主机 IP