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()用于网络托管和自托管.GetOwinContext是HttpRequestMessageSystem.Web.Http.Owin.dll程序集中的扩展方法,并在其中定义.
UPDATE
我已回答了您的原始问题,即如何在Web托管和自托管中获取OWIN上下文.现在,通过评论中的其他问题,您已经大大扩展了问题的范围.但是存在一个根本问题.IOwinContext不是OWIN的东西,它是Katana的东西.您不能指望OWIN上托管的任何框架以形式提供上下文IOwinContext.ASP.NET Web API可以,但不是每个框架都应该这样做.IOwinContext是OWIN环境字典的抽象,这个字典可供任何OWIN中间件使用.但是,通过在框架之上工作,您不再可以直接访问OWIN环境,而只能通过特定框架决定公开上下文的方式.
对于Nancy,您必须使用NancyContext到Items字典并查找与"OWIN_REQUEST_ENVIRONMENT"键对应的值.对于SignalR,Environment属性IRequest使您可以访问OWIN环境.拥有OWIN环境后,您可以OwinContext使用环境创建新环境.
首先,我必须纠正我的问题。
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。