ASP.NET 核心中间件还是 OWIN 中间件?

ASP.NET Core middleware or OWIN middleware?

据我了解,ASP.NET Core 除了自身的本机中间件外,还支持 OWIN 中间件(通过 app.UseOwin())。

ASP.NET核心中间件和OWIN中间件有什么区别?

在设计新的中间件时,我如何知道应该将其设计为 ASP.NET 核心中间件还是 OWIN 中间件?

你的问题让我很好奇,我想分享一下我到目前为止学到的东西。

Katana 是 OWIN 规范的实现。在 Katana 3.0 版本之后,这项技术已经完全集成到我们今天称为 ASP.NET Core 的 Web 堆栈中。

虽然此转换在很大程度上与 OWIN 规范保持相似。虽然做了一些改动。为了在 ASP.NET Core 中使用现有的 OWIN 中间件,通过可选功能(“app.UseOwin()”)支持 OWIN。

如果您想使用中间件 ASP.NET 应用程序和 ASP.NET 核心应用程序作为目标,那么我会使用 OWIN 中间件。如果您想为 ASP.NET 核心开发人员提供第一个 class 公民体验,那么 ASP.NET 核心中间件将被认为更 "fitting".

关于ASP.NET核心中间件和OWIN中间件之间关系的一些信息可以在这里找到:

我是这样理解的; ASP.NET 核心中间件比 OWIN 中间件处于更高级别。

ASP.NET 核心中间件的优点是,当您传入可以使用的 HttpContext 时,开发中间件要容易得多。缺点是你开发的中间件依赖ASP.NETCore.

OWIN 处于较低级别,您将获得一个 IDictionary<string, object> 的 OWIN 环境。优点是它不依赖于 ASP.NET 因此可以在任何 OWIN 服务器(例如 Nowin)上 运行。缺点是编码需要更多精力,因为您必须从 OWIN 环境构建自己的上下文或直接使用 OWIN 环境字典并跟踪所有 OWIN keys 和对象。

编辑:您不必自己跟踪 OWIN 密钥,您可以使用 OwinEnvironment class 获得强类型环境。

var environment = new OwinEnvironment(HttpContext);
var features = new OwinFeatureCollection(environment);