我需要运行我的应用程序,它在IIS和.NET CLR self host模式下都提供了一些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自我宿主模式下做什么?
发布于 2016-02-06 22:35:18
首先,我必须纠正我的问题。
HttpContext.Current在基于ASP.NET和集成的IIS pipeline.But的应用程序中可用。我们不能在没有asp.net anywhere的情况下使用这个类,即使在集成的IIS管道上也是如此。
答案:
1-在你需要IOwinContext的任何地方,你都必须使用依赖注入,例如通过构造函数注入。
2-将一切配置为基于Owin,SignalR仅基于Owin,但同时使用Web和owin,如果有服务器端视图,请使用nancy。开发自己的中间件,而不是编写IIS或ASP.NET处理程序和模块。
3-使用Autofac.Owin & AutoFac.WebApi & AutoFac.WebApi.Owin & Autofac.SignalR,你可以在你的应用程序中设置跨所有自有中间件的依赖注入。
4- Autofac将实例化web api控制器、signalr集线器和owin中间件,它将使用构造函数注入将IOwinContext实例传递给您想要的类。
我的测试在Owin IIS/Helios (没有asp.net),Owin SelfHost,甚至Owin Test Server上都没问题。
此方法类似于asp.net vNext。当您的应用程序准备好投入生产时,您可以轻松地将其迁移到asp.net vNext。
发布于 2014-10-06 12:26:55
您可以将Request.GetOwinContext()
用于web托管和自托管。GetOwinContext
是HttpRequestMessage
的扩展方法,在System.Web.Http.Owin.dll程序集中定义。
更新
我已经回答了你最初的问题,那就是如何在网络托管和自我托管的上下文中获得所有权。现在,通过你在评论中提出的额外问题,你已经大大拓宽了你的问题的范围。然而,有一个根本的问题。IOwinContext
不是OWIN的东西,它是Katana的东西。您不能期望任何托管在OWIN上的框架以IOwinContext
的形式提供上下文。ASP.NET Web API是这样做的,但并不是每个框架都应该这样。IOwinContext
是对OWIN环境字典的抽象,该字典可用于任何OWIN中间件。但是,通过在框架之上工作,您不能再直接访问OWIN环境,而只能通过该特定框架决定公开上下文的方式来访问。
对于Nancy,您必须使用NancyContext
来访问Items
字典并查找与键"OWIN_REQUEST_ENVIRONMENT“相对应的值。对于SignalR,IRequest
的Environment
属性允许您访问OWIN环境。一旦拥有了OWIN环境,就可以使用该环境创建新的OwinContext
。
https://stackoverflow.com/questions/26201032
复制相似问题