OWIN(.NET 开放 Web 接口)的幕后故事

news2024/11/26 9:29:00

在本文中,我们将了解 OWIN 是什么以及它的创建历史。本文将帮助那些想知道它背后的人。

我们将了解一群人如何为 .NET 社区带来宝贵的想法。同样重要的是,微软已经接受了 OWIN,而 ASP.NET Core 基本上就是建立在这个想法之上的。

简单来说,OWIN 是 .NET 开放 Web 接口的缩写,是一种提供将 Web 服务器与 Web 应用程序解耦的规范。该规范也是所有 .NET 生态系统的开放标准。

OWIN 的官方定义是 — “定义了 .NET Web 服务器和 Web 应用程序之间的标准接口。OWIN 接口的目标是解耦服务器和应用程序,鼓励开发用于 .NET Web 开发的简单模块,并通过成为开放标准来刺激 .NET Web 开发工具的开源生态系统。”

“规范”这个词可能会让您感到困惑,但它指的是标准化的契约/接口,规定了 Web 服务器和应用程序之间的通信方式。因此,这些东西不是具体的实现,而是告诉开发人员如何在 Web 服务器和 Web 应用程序之间进行通信。

故事

OWIN 的故事始于 2010 年,当时一群人受到其他编程语言库的启发,试图创建一个在 Web 服务器和 Web 应用程序/框架之间提供 HTTP 抽象的库。

有一天,一群正在开发自己的框架/库的人,Ryan Riley(Kayak 的创建者)向其他正在开发其框架/库的人发送了一封电子邮件,内容是分享知识和共同努力(因为他们正在开发相同和不同但互补的东西)。

2010 年 9 月 7 日,Ryan Riley 发送的第一封电子邮件如下所示。

然后,大家开始一起讨论,因为这个信息很有道理。他们开始通过 Google 群组进行合作。

首先,小组开会寻找解决问题的方法。主要问题是,

  • ASP.NET 与 IIS (System.Web.* 包) 耦合
  • ASP.NET 太重
  • IIS 太慢(旧版本)
  • 很难实现 REST(比如最小 API — Sinatra -> DSL)

此外,.NET 社区需要能够与不同的轻量级 Web 服务器协同工作的解耦/独立、轻量级、高效的 Web 框架。

于是,一群人开始从 Rack(Ruby)和 WSGI(Python)中寻找灵感,开始解决这个问题。简单来说,Rack 和 WSGI 定义了 Web 服务器和 Web 应用程序之间的通用接口。

2010 年 9 月 27 日,第一稿来自 Benjamin van der Veen。

如您所见,该思想基于 Responder、Request 和 Response 接口。(它从服务器端提供某些抽象,并通过传递到应用程序端的 Request 和 Response 提供抽象。该思想通过接口提供标准化)

2010 年 11 月 29 日,该小组的一名成员 (Scott Koon) 创建了一个名为“.NET HTTP Abstractions”的工作组(请查看 Google 群组)。

这群人就 Web 服务器包装器达成了共识。同时,他们确定了 .NET 开放 Web 接口 (OWIN) 的命名法,并开始编写规范。

此外,在规范开始时,一群人就宣布了目标。

  • 无依赖关系
  • 风格灵活
  • 服务器独立性

好吧,在编写规范的过程中,当然遇到了一些问题(我将跳过这部分,如果您想了解更多详细信息,可以查看 Google 群组和网站链接)。

经过一番头脑风暴和实验,大家找到了以下解决方案,如下所示。

他们专注于“Delegate Of Doom”(非正式术语),它限制了为 Web 服务器和应用程序之间的通信提供最小依赖性和契约(标准化)的模式或技术。这个想法是创建通信契约 + 通信管道。

他们决定创建一个入口点,为那些想要开始使用 OWIN 标准的人提供一个辅助库。这个库在Github上是开源的。

2011 年 7 月 25 日,OWIN 项目公开发布,标志着协作创建规范的开始。

最终,2012年12月,OWIN项目发布了其第一个正式版本1.0。

OWIN

本节将介绍总体思路。不涉及规格细节。

上图是 OWIN 的鸟瞰图。正如我之前所说,OWIN 只是提供 Web 服务器和 Web 应用程序之间的解耦通信。但请注意,OWIN 不是框架、库或实现。如果您查看 OWIN 规范,您将获得有关 Web 服务器和应用程序如何相互通信的规则或代码示例的详细信息。

要了解细节,有必要从参与者开始,这有助于理解 OWIN 的思想。

  • Web 框架: OWIN 之上的独立组件,公开自己的对象模型或 API,应用程序可使用这些模型或 API 来促进请求处理。Web 框架可能需要从 OWIN 语义转换的适配器层。
  • Web 应用程序:可能建立在 Web 框架之上的特定应用程序,使用 OWIN 兼容服务器运行。
  • 中间件:在服务器和应用程序之间形成管道的传递组件,用于检查、路由或修改特定目的的请求和响应消息。
  • 服务器:直接与客户端通信然后使用 OWIN 语义处理请求的 HTTP 服务器。服务器可能需要转换为 OWIN 语义的适配器层。
  • 主机:应用程序和服务器在其中执行的进程,主要负责应用程序的启动。某些服务器也是主机。

主要是,参与者对于任何 Web 应用程序来说都是必须的。因此,OWIN 指示他们所有人实现目标。

请注意,为了便于理解,我将用运行时事物来描述所有过程。部分解释可能超出了 OWIN 的范围。

Web 服务器和 Web 应用程序(Web 框架的顶层)之间的通信。因此,这些参与者也具有巨大的计算逻辑。这个想法带来了用于处理 Web 请求和响应生命周期的管道。这也依赖于管道架构,该架构提供实现 Web 服务器和 Web 应用程序之间的交叉关注点。


一切始于主机,它创建所需的环境和配置内容。在运行时,它应该由内置的 Web 服务器和位于框架顶部的应用程序组成。因此,Web 服务器基本上会监听 HTTP 请求,填充内容和一些数据结构,然后将它们发送到通信管道。

构建管道的想法始于中间件,它是所有部分的链或过滤器。中间件提供了一些横切关注点,并有助于处理请求和响应生命周期。当请求来自服务器时,将它们发送到第一个链/过滤器(中间件),然后请求将一个接一个地继续。管道末端的请求由应用程序处理并生成响应,响应以反向方式发生同样的事情。

到目前为止,我们已经解释了总体思路,您可以查看规范以了解更多细节。

OWIN的解决方案从以下开始。

using Environment = IDictionary<string, object>
using AppFunc = Func<Environment, Task>

嗯,比你想象的要容易一些!

  • 环境是包含所有需要的数据(包括请求和响应对象)的键值对。因此,当服务器和应用程序相互通信时,它是有意义的!
  • AppFunc 是处理请求的委托。

基本上,AppFunc 如何处理应用程序端的请求?代码如下所示。

using System.IO;
using System.Text;
using Headers = IDictionary<string, string[]>;
var app = AppFunc(env =>
{
    var bytes = Encoding.UTF8.GetBytes("Hello, OWIN!");
    var length = bytes.Length.ToString();
    var headers = env["owin.ResponseHeaders"];
    headers.Add("Content-Type", new[] { "text/plain" });
    headers.Add("Content-Length", new[] { length });
    var stream = (Stream)env["owin.ResponseBody"];
    return stream.WriteAsync(bytes, 0, bytes.Length);
});

AppFunc 上面的代码是中间件,它可以封装链中的下一个元素(即中间件)。并且它会调用下一个元素,以与其他元素相同的方式重复,就像一个嵌套链一样。

因此,它可以作为类和函数来实现。但我只展示类示例。

public class LoggingMiddleware
{
    private AppFunc _next;
    public LoggingMiddleware(AppFunc next)
    {
        this._next = next;
    }
    public Task LogBefore(Environment env)
    {
        // Implementation
    }
    public Task LogAfter(Environment env)
    {
        // Implementation
    }
    public async Task Invoke(Environment env)
    {
        LogBefore(env);
        await _next(env);
        LogAfter(env);
    }
}

这就是中间件方面。

还具有用于管道端的 IAppBuilder 接口。其主要目的是提供配置处理 HTTP 请求和响应的中间件管道的契约。

  • 最初旨在提供代表签名
  • 后来添加了 IAppBuilder 并作为唯一的接口
public interface IAppBuilder
{
    IDictionary<string, object> Properties { get; }
    IAppBuilder Use(object middleware, params object[] args);
    object Build(Type returnType);
    IAppBuilder New();
}

可以看出,OWIN 解决方案仅依赖 FCL,因此依赖性极小。这些基本的东西有助于 OWIN 实现其目标。

PS 微软实现了 OWIN 的想法,它是 Katana,但这是另一个话题。

结论

OWIN 是一种规范,它提供了 Web 服务器和 Web 应用程序之间解耦的规则。此外,它还有助于实现 Web 服务器和应用程序之间的模块化架构。其背后的理念已在许多其他 Web 技术环境中得到应用。OWIN 是一个强大的理念,它为 .NET 社区提供了传统 IIS 和 ASP.NET(旧)托管模型的替代方案,解决了它们的局限性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

概率论论文(关于“到课率”的贝叶斯推理应用)

概率论论文(关于“到课率”的贝叶斯推理应用) 全条件概率公式和贝叶斯公式趣味识 思考1&#xff1a; (引自贝叶斯公式及朴素贝叶斯分类算法应用初探) “狼来了”的故事想必大家都知道&#xff0c;小孩子第三次对村民说狼来了的时候&#xff0c;村民们没有相信他的话&#xff0…

操作系统-中断和异常

中断和异常 用户态&#xff1a;普通应用程序运行在用户态&#xff0c;有很多权限限制 内核态&#xff1a;操作系统运行在内核态&#xff0c;有完全的权限访问和管理所有资源&#xff08;硬件&#xff0c;内存&#xff09; 中断的作用 把CPU从用户态变内核态 异常&#xff08…

谈谈WebComponents | 前端开发

一、 源起 让我们以一个例子开始。 假设我们要做一个环形进度条&#xff0c;它可以&#xff1a; 1、根据进度数值的不同&#xff0c;计算出百分比&#xff0c;以渲染对应的角度值。 2、根据设置的进度不同&#xff0c;我们用不同的颜色加以区分。 3、在环的中间我们以动画递增的…

[电子电路学]电路分析基本概念1

第一章 电路分析的基本概念和基本定律 电路模型 反映实际电路部件的主要电磁性质的理想电路元件及其组合&#xff0c;是实际电路电气特性的抽象和近似。 理想电路元件 实际电路器件品种繁多&#xff0c;其电磁特性多元而复杂&#xff0c;分析和计算时非常困难。而理想电路元件…

240627_关于CNN中图像维度变化问题

240627_关于CNN中图像维度变化问题 在学习一些经典模型时&#xff0c;其中得维度变化关系总搞不太明白&#xff0c;集中学习了以下&#xff0c;在此作以梳理总结&#xff1a; 一般来说涉及到的维度变换都是四个维度&#xff0c;当batch size4&#xff0c;图像尺寸为640*640&a…

正点原子 iwdg wwdg timr

这个iwdg 的超时时间的计算公式 ———————————————— wwdg 超时时间的计算公式 4096是stm32固定死的 wwdg的时钟频率是36mhz&#xff0c;因为apb1分频2得到wwdg的时钟频率&#xff0c;这个是stm32自己就这样做的 看cubemx的时钟图也看得出来 iwdg和wwdg的区分 ti…

[Java基础揉碎]反射

目录 引出反射机制​编辑 介绍反射机制​编辑 反射的优点和缺点 (反射调用优化 )​编辑 Class类 class常用方法 ​编辑 ​编辑 获取class类对象的不同方式 哪些类型有class对象 ​编辑 类加载 ​编辑类加载流程图 类加载的五个阶段 ​编辑 通过反射获取类的结构信…

合芯科技冯春阳博士受邀出席苏州大学技术分享会

近日&#xff0c;苏州大学电子信息学院与合芯科技苏州公司成功举办“新时代与‘芯’相遇&#xff0c;科技赋能向未来”的技术分享会。合芯科技冯春阳博士进行了主题为“高性能CPU关键技术与发展现状”的专题分享&#xff0c;并参加导师聘请仪式。苏州大学电子信息学院党委副书记…

【ONLYOFFICE 8.1】的安装与使用——功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、ONLYOFFICE 简介三、安装1. Windows/Mac 安装2. 文档开发者版安装安装前准备使用 Docker 安装使用 Linux 发行版安装配置 ONLYOFFICE 文档开发者版集成和开发 四、使用1. 功能全面的 PDF 编辑器PDF 查看和导航P…

如何做好新闻软文宣发媒体资源筛选?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 新闻软文宣发是指企业通过创造或利用新闻事件&#xff0c…

使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南

在 Linux 系统下&#xff0c;使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。以下是具体的操作步骤&#xff1a; 1. 安装 systemd 如果您的 Linux 服务器上尚未安装 systemd&#xff0c;可以使用包管理器如 yum&#xff08;适用于 Cent…

stm32 No traget connected/debug识别不到串口的问题

关于stm32串口识别不到&#xff0c;第一步先确定是否线接错&#xff08;stlink与stm32接口对应&#xff09;&#xff0c;如果确认接线没有问题的话&#xff0c;可以使用以下方法&#xff0c;成功率较高。 首先将stlink的boot0置1&#xff0c;就是把跳线帽换到高电平这一侧&…

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式4599张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4599 标注数量(xml文件个数)&#xff1a;4599 标注数量(txt文件个数)&#xff1a;4599 标注…

编写一个基于其他系的linux系统并且把它打包为一个iso镜像思想

目录 前面写的一篇文章 前言 isolinux引导模式启动流程 为什么要initramdisk操作而不直接加载文件系统 编写系统的思想 可能问题 一般的iso镜像目前只支持最大4G的大小&#xff0c;需要怎么解决&#xff1f; 如何去找驱动 木木em哈哈想说的话&#xff08;与本博文无光&…

详细分析SpringBootTest中的测试类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战3.1 项目测试3.2 功能测试 前言 书写测试类&#xff0c;一般只需要加入Test即可&#xff0c;但是结合Springboot项目来整体测试对应需要怎么下手 详细的Java知识点推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面…

[CAN] 通讯协议手动解析与手动打包 [手撕编码格式]

手动解析与手动打包 一、Intel格式编码1.1 报文解析。1.2 报文打包二、Motorola格式通讯协议2.1 报文解析。2.2 报文打包🙋 前言 CAN有两种编码格式:Intel编码格式 和 Motorola编码格式,本教程将分别对两种格式进行手动解析与手动打包。 一、Intel格式编码 假设已知雷达CAN…

【C++题解】1721. 输出个位为5或者个位为8数

问题&#xff1a;1721. 输出个位为5或者个位为8数 类型&#xff1a;简单循环 题目描述&#xff1a; 请从小到大输出 1∼n 中所有个位为 5 或者个位为8 的所有的整数&#xff0c;每行 1 个。 比如&#xff0c;假设 n20&#xff0c;那么满足条件的数输出如下&#xff1a; 5 8 1…

【多线程】如何解决线程安全问题?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. synchronized 关键字1.1 锁是什么1.2 如何加锁1.3 synchronized 修饰方法1) 修饰普通成员方法2) 修饰静态…

Rust 程序设计语言学习——泛型、Trait和生命周期

每一种编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是泛型。泛型是具体类型或其他属性的抽象替代。 Trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 Trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为…

Java——IO流(一)-(8/8):释放资源-try-catch-finally、try-catch-resource

目录 try-catch-finally 介绍 实例演示1 实例演示2 try-catch-resource 介绍 实例演示 try-catch-finally 介绍 普通的释放流的方法可能会因中间的异常或是其他原因&#xff0c;导致程序执行不到释放流的代码就结束了&#xff0c;会有资源浪费的风险&#xff0c;所以建…