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

时间:2014-10-05 08:44:26

标签: asp.net .net iis owin self-hosting

我需要运行我的应用程序,它在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自我主机模式下做什么?

2 个答案:

答案 0 :(得分:16)

您可以使用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字典并查找与键#34; OWIN_REQUEST_ENVIRONMENT"对应的值。对于SignalR,Environment的{​​{1}}属性可让您访问OWIN环境。拥有OWIN环境后,您可以使用环境创建新的IRequest

答案 1 :(得分:1)

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

HttpContext.Current在基于ASP.NET和集成IIS管道的应用程序中可用。但是我们不能在没有asp.net的情况下使用这个类,即使在IIS集成管道上也是如此。

答案:

1-你需要IOwinContext的任何地方,你需要使用依赖注入,例如通过构造函数注入。

2-配置基于Owin的所有工作,SignalR仅基于Owin,但使用Web Api&如果有的话,并使用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测试服务器上都可以。

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