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

在本文中,我们将了解 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(旧)托管模型的替代方案,解决了它们的局限性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pppd 返回错误码 含义

错误码 00&#xff1a; pppd已经断开&#xff0c;或者已经成功建立连接后请求方又中 断了。 01&#xff1a; 发成了一个严重错误&#xff0c;例如系统调用失败或者访问非法内存。 02&#xff1a; 处理给定操作是检测到错误&#xff0c;例如使用两个互斥的操作。 03&#xff1a;…

live555的核心数据结构值之闭环双向链表

live555是采用单进程,单线程的服务器,能够同时支持多个客户端连接,并且有条不紊的进行媒体流的调度,很大一部分原因在于对数据结构的巧妙应用。 下面介绍live555核心的数据结构:闭环双向链表 什么是闭环双向链表? 描述: 一个节点保存有前一个节点的地址和后一个节点的…

2018年全国大学生数学建模竞赛A题高温服装设计(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分Matlab源代码问题11 求解h1h22 已知h1h2求解温度分布 问题21 求解第二层最佳厚度 四、完整word版论文和源代码&#xff08;两种获取方式&#xff09; 一、部分题目 2018 年高教社杯全国大学生数学建模竞赛题目 A 题 高温作业专用服…

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

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

2024年度临沂市安全文化书画摄影展开幕

人海信息网山东讯 6月27日&#xff0c;2024年度临沂市安全文化书画摄影作品展&#xff0c;在临沂高新区隆重开幕。本次书画摄影展深入贯彻“以人为本&#xff0c;安全发展”的重要思想&#xff0c;立意高远&#xff0c;内涵丰富&#xff0c;思想深邃&#xff0c;承载着健康、幸…

风机过滤机组介绍

一、定义 FFU英文全称为&#xff08;Fan Filter Unit&#xff09;&#xff0c;中文专业用语为风机过滤机组。FFU广泛应用于洁净室、洁净工作台、洁净生产线、组装式洁净室和局部百级等应用场合。 二、FFU的组成 FFU主要由四部分组成&#xff1a; 1.箱体 其材质常用镀锌铝合…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(转换、拆分、分割、连接、替换、查找、“Like“)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录 问题描述GPOPS代码main functioncontinuous functionendpoint function仿真结果 最后 问题描述 参考文献&#xff1a;[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4…

鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一

一、鸿蒙开发环境搭建 DevEco Studio安装 下载 访问官网&#xff1a;https://developer.huawei.com/consumer/cn/deveco-studio/选择操作系统版本后并注册登录华为账号既可下载安装包 安装 建议&#xff1a;软件和依赖安装目录不要使用中文字符软件安装包下载完成后&#xff0…

怎么打印加密的Excel文件,有哪些方法?

很多小伙伴都喜欢使用Excel来创建或是编辑表格文档&#xff0c;因为Excel中的功能十分的丰富且强大&#xff0c;在Excel中我们可以对表格文档进行各种操作。有的小伙伴可能在打印时需要给每一页表格添加页码&#xff0c;但又不知道该在哪里找到相关操作&#xff0c;其实很简单&…

FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外&#xff0c;还有于2017年推出的SRT协议&#xff0c;相比常见的RTMP协议&#xff0c;SRT协议具有更低的延迟&#xff0c;并且消…

干货分享 | 学会这7个工具方法,数字化转型规划不是难题

提到数字化转型&#xff0c;首要做的便是分析企业现有的业务流程和价值流&#xff0c;发现企业利润来源的关键点&#xff0c;进而有针对性的数字化转型。要实现传统业务向数字化业务的转变&#xff0c;制定出高效、灵活的业务流程优化策略显得至关重要&#xff0c;这样才能找到…

Modbus为何要转成EtherCAT

1. Modbus是什么&#xff1f; Modbus是一种工业通信协议&#xff0c;广泛应用于工业自动化领域。它支持多种通信方式&#xff0c;包括RS-232、RS-485和TCP/IP等。Modbus协议简单易用&#xff0c;能够实现设备之间的数据交换和控制命令的传输。然而&#xff0c;它在数据传输速率…

Web渗透:任意文件下载

任意文件下载漏洞&#xff08;Arbitrary File Download Vulnerability&#xff09;是一种常见的Web安全漏洞&#xff0c;它允许攻击者通过修改输入参数&#xff0c;从服务器下载任意文件&#xff0c;而不仅仅是预期的文件&#xff1b;通常这种漏洞出现在处理用户输入的地方&…

一款开源、免费、现代化风格的WPF UI控件库

前言 今天大姚给大家分享一款开源&#xff08;MIT License&#xff09;、免费、现代化风格的WPF UI控件库&#xff1a;ModernWpf。 项目介绍 ModernWpf是一个开源项目&#xff0c;它为 WPF 提供了一组现代化的控件和主题&#xff0c;使开发人员能够创建具有现代外观的桌面应…

优化 C# 和 .NET Core Web API 中的 LINQ 查询

LINQ&#xff08;语言集成查询&#xff09;是 C# 中的一项强大功能&#xff0c;允许开发人员以可读且简洁的方式查询和操作数据。但是&#xff0c;LINQ 的使用效率低下可能会导致性能瓶颈&#xff0c;尤其是在处理 .NET Core Web API 中的大型数据集时。优化 LINQ 查询对于维护…

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

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

数据可视化期末考试(logistic回归)

目录 1、Logistic回归 2、梯度上升算法 1、Logistic回归 假设现在有一些数据点&#xff0c;我们利用一条直线对这些点进行拟合(该线称为最佳拟合直线)&#xff0c;这个拟合过程就称作为回归&#xff0c;如下图所示&#xff1a; Logistic回归是分类方法&#xff0c;它利用的是…

用FFmpeg合并音频和视频

使用FFmpeg合并音频和视频是一个相对直接的过程。可以通过以下一些基本的步骤和命令示例完成这个任务&#xff1a; 安装FFmpeg&#xff1a;首先&#xff0c;确保你的系统中已经安装了FFmpeg。你可以从[FFmpeg官网](Download FFmpeg)下载并安装它。 准备素材&#xff1a;确保你…

压铸工艺介绍

1.压铸的主要特点 1.压铸是让有色金属熔融&#xff0c;并在加压的情况下让其流入模具中。由于使用模具&#xff0c;所以适合进行大量生产。不同于其他铸造方式&#xff0c;压铸需要加压&#xff0c;所以具有尺寸精度优秀的特点。此外&#xff0c;由于并非使用砂型而是采用模具…