在自托管模式下获取当前的owin上下文

Yas*_*adi 12 .net asp.net iis self-hosting owin

我需要运行我的应用程序,它在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;
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我的代码在IIS上工作正常,但在.NET Self Host模式下我该怎么办?

Bad*_*dri 16

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

UPDATE

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

对于Nancy,您必须使用NancyContextItems字典并查找与"OWIN_REQUEST_ENVIRONMENT"键对应的值.对于SignalR,Environment属性IRequest使您可以访问OWIN环境.拥有OWIN环境后,您可以OwinContext使用环境创建新环境.

  • 是的,你是对的,但信号r怎么样?南希等等?对于已经托管在owin上的所有框架,我需要一些全局的东西. (2认同)

Yas*_*adi 0

首先,我必须纠正我的问题。

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

回答:

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

2- 配置一切以基于 Owin 工作,SignalR 仅基于 Owin,但同时使用 Web Api 和 owin,并使用 nancy 作为服务器端视图(如果有)。开发 owin 中间件,而不是编写 IIS 或 ASP.NET 处理程序和模块。

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。