在.NET开发中,开发者经常需要在应用程序中嵌入HTTP监听器,以便于配置或控制。然而,长期以来,实现这一功能的唯一方式是自行实现或使用第三方库,或者更糟糕的是,利用ASP.NET应用程序中提供的后台工作线程。OWIN(Open Web Interface for .NET)项目的出现,改变了这一现状。OWIN的目的是抽象整个ASP.NET堆栈,使其与Web服务器解耦,从而任何Web服务器都能够托管应用程序。
与OWIN项目相辅相成的是Katana项目,其目标是允许任何应用程序托管基于OWIN的应用程序。这非常酷,因为这意味着可以在应用程序中实现ASP.NETWeb API,从而快速获得一个功能完备的通信堆栈,同时使用标准协议。
在应用程序中实现监听器非常简单。首先,需要在项目中安装NuGet包:
Microsoft ASP.NETWeb API2.2 OWIN Self Host
然后,创建一个类,该类包含以下方法签名:
Configuration(Owin.IAppBuilder)
在上述类的相同命名空间中实现API代码(控制器、模型、扩展、处理器等)。
如第2点所述,需要一个实现来配置Web应用程序。有许多在线示例,它们都有一个类似于以下的Configuration方法:
public void Configuration(IAppBuilder builder)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
builder.UseWebApi(config);
}
可以像在任何ASP.NET应用程序中一样使用HttpConfiguration。在MVC项目中更喜欢基于属性的路由,但完全可以选择标准的基于约定的属性路由方案。此外,还可以使用配置来绑定格式化程序、处理器等,以适应监听器。对于应用程序来说,安全层并非必要,但完全可以轻松实现任何可用的授权和认证提供程序。
监听器是通过Microsoft.Owin.Hosting.WebApp类启动的。例如:
IDisposable reference = Microsoft.Owin.Hosting.WebApp.Start<TConfigType>(string uri);
TConfigType代表包含Configuration方法的类型。它将使用该类型来配置并启动监听器。uri的值是希望路由到监听器的地址和端口(例如:http://localhost:80)。
完全可以将实现的HTTP监听器作为应用程序的唯一部分,但本文的目的是要展示API作为状态应用程序中的一个端点的使用。用途范围从为Windows服务提供控制机制,到提供应用程序运行状态的信息。正在构建的应用程序的特定用例是一个工作器,它收集数据并进行转换,并通过API接口检索转换并启动新的收集过程(是的,知道这个描述有点泛泛)。通过自托管OWIN应用程序,可以运行状态操作并在与API相同的上下文中共享数据。
以非常简单的方式解决了这个问题。创建了一个名为IHostApp的接口,具有以下实现合同:
string Url {
get;
}
void Start();
void Stop();
具体实现还有一个泛型参数,其值是包含Configuration方法的类型。在内存中保持这个实例,服务器将继续运行。在Start方法中执行WebApp.Start<T>(url),将返回的IDisposable存储为成员,并在Stop方法中释放该成员。通常使用Microsoft Unity来解析这些IHostApp实例,为每个希望监听的地址使用一个。
应该仔细考虑是否在公共地址上公开自托管的OWIN应用程序。成熟的Web服务器中经常发现安全漏洞,并且有专门的团队全职致力于加强他们的软件以抵御恶意攻击。因此,认为或能够以兼职的方式做得更好将是天真的。
需要设置正确的URL ACL,以便在除localhost之外的任何地址上监听。
这通常应该用于简单的情况,比如为应用程序提供轻量级的接口。请记住,OWIN Self-Hosted是一个相对年轻的项目,因此可能有很多未知的制约因素影响良好的性能。