我需要运行我的应用程序,它在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自我主机模式下做什么?
答案 0 :(得分:16)
您可以使用Request.GetOwinContext()
进行网络托管和自托管。 GetOwinContext
是HttpRequestMessage
的扩展方法,在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。