使用 REST API 作为应用程序中的接口,通过 OWIN 自托管
使用 REST API 作为应用程序中的接口,通过 OWIN 自托管
微软的 ASP.NET 堆栈一直以来都是一个强大的应用框架,但它长期以来一直依赖于 IIS 才能运行。这总是一个遗憾,因为在一个有状态的应用程序中拥有一个 HTTP 监听器可以成为配置或控制的非常方便的接口。很长一段时间以来,你能做到这一点的唯一方法就是实现你自己的/使用第三方堆栈,或者更糟的是,利用 ASP.NET 应用程序中可用的后台工作者。 引入了 Open Web Interface for .NET (OWIN)。 OWIN 项目的目的是,借鉴 Rack/Rails 的经验,将整个 ASP.NET 堆栈从 Web 服务器中抽象出来。 通过开源 ASP.NET 堆栈,并通过 OWIN 提供一个标准的、开放的接口,任何 Web 服务器都可以用来托管一个应用程序。
OWIN 的补充是 Katana 项目,其目的是允许任何应用程序托管一个基于 OWIN 的应用程序。 这真的很酷。 我可以在我的应用程序中拥有一个 ASP.NET Web API 实现,这为我提供了一个快速但功能齐全的通信堆栈,使用标准协议。
在你的应用程序中实现一个监听器再简单不过了。
- 在你的项目中安装 Nuget 包 Microsoft ASP.NET Web API 2.2 OWIN Self Host
- 创建一个具有以下方法签名的类:
Configuration(Owin.IAppBuilder)
- 在与上述类相同的命名空间中实现你的 API 代码(控制器、模型、扩展、处理程序等)。
启动你的 Web 应用程序
如项目 #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
代表你配置方法所在的类型。它将使用该类型来配置并启动你的监听器。 uri
的值是应该路由到你的监听器的地址和端口(例如:https://:80)。
控制你的监听器
你完全可以将你实现的 HTTP 监听器作为你的应用程序的唯一部分,但本文的目的是展示如何将 API 用作有状态应用程序中的端点。 其目的包括为 Windows 服务提供控制机制,以及提供有关应用程序运行状态的信息。 我正在构建的应用程序的具体用例是一个收集和转换数据的 worker,并带有一个 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 是一个相对较新的项目,因此可能会有很多未知的限制因素会影响良好的性能。
其他阅读
以下是关于该主题的一些其他资源,所有这些都比我的写得更好。 真的,这些是我学习如何运行自托管代码的地方。 我微薄的补充是让它更有状态并且更 DRY
- 自托管 ASP.NET Web API
- 使用 OWIN 自托管 ASP.NET Web API 2
- Katana 项目主页。 它实际上不再维护了,但你可以在这里很好地了解该项目的起源。