ASP.NET Core 还在使用 OWIN 吗?

Does ASP.NET Core still use OWIN?

我注意到在使用 C# 构建一个较旧的 MVC 项目时,有很多对 OWIN 库的引用。但是在 VS2015 SP3 中创建 .NET Core web 应用程序时,似乎没有引用它。

这个库已经过时了吗?

OWIN 不是图书馆,它是 specification。从文档中,

OWIN defines a standard interface between .NET web servers and web applications.

OWIN 的 "big idea" 是您可以将应用程序与其 运行 所在的服务器分离,前提是每个人都同意使用一个通用接口。实际上,与 OWIN 兼容的服务器可以 运行 任何与 OWIN 兼容的应用程序。这是对我们过去的紧耦合的改进(应用程序只能 运行 在 IIS 上,仅此而已)。

许多 OWIN 规范专门用于描述各种属性的名称。与 OWIN 兼容的服务器将传入请求转换为 Dictionary<string, object>,其中包含一堆键,例如 owin.RequestBodyowin.ResponseBody。如果请求被传递到的应用程序或中间件知道如何读取这些键,它就可以处理请求。就是这样!

个 OWIN 库(如 OWIN and Microsoft.Owin),这是一个常见的混淆来源。这些库只是 OWIN 接口的类型安全实现,或者是使与 OWIN 兼容的组件交互更容易的助手。

正如@Murray 和@Tseng 指出的那样,ASP.NET Core 不是基于 OWIN 构建的,但它与 OWIN 兼容。或者,更确切地说,(Kestrel、WebListener、IIS)上 ASP.NET Core 运行 的 servers 与 OWIN 兼容。 ASP.NET Core 是对低级请求("OWIN level")的进一步抽象,可以轻松构建诸如控制器和服务器呈现页面之类的东西。

因为 ASP.NET Core OWIN 兼容的,所以很容易插入任何 OWIN 兼容的中间件。 Microsoft.AspNetCore.Owin 包公开了一个 UseOwin 方法:

app.UseOwin(pipeline =>
{
    pipeline(next => OwinHello);
    // where  OwinHello is a compatible middleware function
});

有关将 OWIN 中间件添加到 ASP.NET 核心管道的更多示例,请参阅 documentation