Owin学习笔记(一) Owin的前生今世
ASP.NET框架至今为止已经存在了数十年了,大量的网站使用ASP.NET框架进行开发。随着网站应用开发技术的进步, 许多网站应用开发框架有了新的流行趋势
- 轻量化
- 模块化
- 可移植
ASP.NET框架在新的流行趋势下,显得非常臃肿,主要原因就是ASP.NET的基础是System.Web程序集,它里面集成了各种网站开发需要的组件,不管你需不需要,他都集成在当中,大量组件耦合在一起,很难分离开来。这与微软之前大而全的思想非常匹配,只要你使用我的ASP.NET框架,所有的网站开发都可以在一个框架中完成。
而且System.Web程序集是.NET Framework的一部分,这就导致他只能跟随.NET Framework的年度更新而更新,这与当前快速迭代的网站应用开发技术不太匹配。
最严重的是System.Web极度依赖IIS服务器,使得ASP.NET只能在Windows服务器上部署,在Linux, Mac等其他服务器上就没有办法施展拳脚。
ASP.NET MVC和ASP.NET Web Api
微软在发现这个问题之后,开始了自己的变革,微软希望将ASP.NET改造成一个可插拔组件集合,而非一个单独的框架。
微软首当其冲的就是将组件移出.NET框架发布。在随后推出的ASP.NET Mvc中微软进行了首次尝试,参考Ruby on Rail, 微软实现了自己的MVC框架,分离了前台页面和后台业务逻辑,并且ASP.NET Mvc是独立于.NET Framework进行发布,这极大的加快了这个框架的迭代速度。
随着网站应用开发技术的继续发展,大量后端的任务前移,静态页面 + Ajax动态填充内容成为流行,微软又推出了自己的轻量级Web服务框架ASP.NET Web Api。这个新生的框架是独立于System.Web程序集的。而且他还首次支持了Custom Host, 使得ASP.NET Web Api可以脱离IIS,在其他地方进行托管(命令行程序,Windows Service)。
Owin的诞生
微软受启于Ruby社区中的思想, 开始对Web服务器和Web框架组件进行解耦,创建了一系列的抽象接口,使Web框架组件不在依赖具体的服务器,而是依赖于这些新的接口,这样就解除了服务器与组件的耦合,所有实现接口的服务器程序,都可以作为组件的托管服务器。
所谓的Owin其实就是抽象接口的统称(The Open Web Interface for .NET)。
Owin的诞生使得Web组件更容易开发,更容易使用,而且对于使得ASP.NET的网站应用可以迁移到所有潜在的系统(Linux, Mac等)中。
Owin的2个核心元素
环境字典
IDictionary<string, object>
环境字典定义了兼容Owin的Web服务器需要在Http请求中读取的数据,以及在Http响应中需要更新或呈现的数据
例:需要从请求中读取的数据
|
Key Name |
Value Description |
|
“owin.RequestBody” |
请求体内容 |
|
“owin.RequestHeader” |
请求头部信息 |
|
“owin.RequestMethod” |
Http请求的方法(Get,Post..) |
|
“owin.RequestPath” |
请求地址 |
|
“owin.RequestPathBase” |
请求地址 |
|
“owin.RequestProtocol” |
请求使用的协议 |
|
“owin.RequestQueryString” |
请求Url中的参数 |
|
“owin.RequestSchema” |
请求的Url Schema, http或者https |
环境字典对应的应用委托字典
Func<IDictionary<string, object>, Task>
该字典中保存了对每个环境字典Key所做对应操作方法,这些方法的输入参数是环境字典Key, 然后返回一个Task
从实现的角度讲,Owin是一个标准,他的目标不是下一代Web开发框架,而是一个Web框架和Web服务器交互的标准
Katana
Katana是武士刀的意思,微软官方依据Owin标准实现的一组Owin组件,这些组件中集成了基础组件(托管程序和服务器)和一些功能组件(授权组件),同时也支持SignalR和ASP.NET Web Api
下面我们以一个Hello World程序为例
首先我们创建一个空的ASP.NET项目

下一步,我们安装Microsoft.Owin.Host.SystemWeb程序集,这个程序集提供了一个运行ASP.NET请求管道的Owin服务器
Install-Package Microsoft.Owin.Host.SystemWeb
安装完成之后, 添加Owin启动类,设置对所有的请求返回文本Hello World
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello World!");
});
}
}
按F5运行之后之后,你会发现他还是使用了默认的IIS Express来运行程序,因为这里使用的兼容System.Web的服务器,默认就是用IIS托管。
切换服务器
然后我们来尝试一下,使用非IIS服务器托管这个Web应用
首先我们需要安装程序集OwinHost, OwinHost是Katana提供的使用HttpListener为基础的服务器,他同样实现了之前的环境字典标准
Install-Package OwinHost
安装完成之后,使用命令行运行OwinHost,启动完毕之后,打开浏览器输入localhost:5000(5000是默认端口), 你就能看到对应的内容。

Katana的架构
Katana从架构上来说分4层,由上到下一次是应用层,中间件层,服务器层,托管层,每一层都可以自由选择使用的组件

托管层
Katana的托管层负责开启Web应用并维护该应用进程,有3种可选的实现
- IIS/ASP.NET – 使用IIS托管
- Custom Host – 自定义托管,Web应用可以托管在命令行或者Windows服务当中
- OwinHost – Katana提供的托管
服务器层
服务器负责监听请求,发送响应。 当前Katana提供的服务器组件有2个
- Owin.Host.SystemWeb
- Owin.Host.HttpListener
中间件层
中间件层负责注入Owin组件管道中使用的组件,Web API, SignalR等都是在这里进行注入启用,这里也是最长扩展的一个部分,开发人员可以自己定义常用的中间件。所有的中间件都必须继承OwinMiddleware抽象类,后续我会写一些中间层扩展的例子
后记
Owin定义一系列规范,来解除服务器和应用之间的耦合,使的整个ASP.NET框架变得越来越轻量化,并提供了一定的可移植性,为后续微软研发ASPNETCore提供了基础,按照官网文档的说明ASPNETCore使用了Owin的规范,但是据先驱者透漏ASPNETCore已经和Owin没有关系了(有待考究),只是沿用了思想,ASPNETCore使用了新的Kestrel服务器,等于说是Owin基本被放弃了。但是如果对于不使用ASPNETCore开发的程序员,学习Owin还是对开发很有帮助的。
Owin学习笔记(一) Owin的前生今世的更多相关文章
- Java NIO 的前生今世 之四 NIO Selector 详解
Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一 ...
- 揭秘 BPF map 前生今世
揭秘 BPF map 前生今世 本文地址:https://www.ebpf.top/post/map_internal 1. 前言 众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向 ...
- Owin学习笔记(二) 中间件开发
Owin中也有类似于ASP.NET的管道,以前在做ASP.NET项目的时候,可以制作很多不同功能HttpHandler或者HttpModule并注册在Web.config中重复使用.在Owin的管道中 ...
- 月光宝盒之时间魔法--java时间的前生今世
月光宝盒花絮 “曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜,等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此.如果可以给我一个机会再来一次的话,我会跟那个女孩子说我爱她,如果非要把这份爱加上 ...
- ASP.NET MVC5 学习笔记-4 OWIN和Katana
1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...
- 【C++学习笔记】 链式前向星
链式前向星是一种常见的储存图的方式(是前向星存图法的优化版本),支持增边和查询,但不支持删边(如果想要删除指定的边建议用邻接矩阵). 储存方式 首先定义数组 head[ i ] 来储存从节点 i 出发 ...
- 我的Android前生今世之缘-学习经验-安卓入门教程(六)
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 据我所知,网上教学资料一堆一堆的,那么还有很多人说,如何学习? ...
- Bootstrap-table学习笔记(二)——前后端分页模糊查询
在使用过程中,一边看文档一边做,遇到了一些困难的地方,在此记录一下,顺便做个总结: 1,前端分页 2,后端分页 3,模糊查询 前端分页相当简单,在我添加了2w条测试数据的时候打开的很流畅,没有卡顿. ...
- nrf51822微信开发入门学习笔记1:开始前的准备
参考:(id:love--baby)https://blog.csdn.net/hunhun1122/article/details/68922493 微信硬件平台:https://iot.weixi ...
随机推荐
- vue基础4-数据绑定
1.v-bind 只能实现数据额单向绑定,从M到V,无法实现数据的双向绑定 改变页面输入框的值,打印数据并未改变. 2.v-model 可以实现数据的双向绑定,从M到V.V到M. 注意:v-mode ...
- Scrapy框架之CrawlSpider
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
- 展开被 SpringBoot 玩的日子 《 二 》 WEB 开发
上篇文章介绍了Spring boot初级教程 :< spring boot(一):入门篇 >,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spr ...
- XIX Open Cup named after E.V. Pankratiev. GP of Poland(AMPPZ-2018)
A. Drone With a Camera 三分套三分. #include<cstdio> #include<cmath> #include<algorithm> ...
- C++ 三大特性:封装、继承、多态性
要讲 封装.继承.多态就必须从面向对象说起 开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称为该软件的问题域.面向对象的编程语言将客观事物看作具有属性和行为(或服务)的对象,通过抽象找出同 ...
- 一个for实现9*9乘法表
今天看到别人一个博客提出来一个非常有趣的题目,写一个9*9的乘法表,要求只使用且仅使用一个for来实现9*9乘法表的打印.(不使用if,switch,?:) 可以用任何语言实现,下面是博主给的ja ...
- summary of week
Summary of week Catalog 计算机基础 解释器 编码 数据类型 输入 输出 变量 注释 运算符 条件判断 循环 Content 计算机基础 计算机组成 软件 解释器 操作系统 : ...
- .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法
web程序发布后,通过浏览器访问程序显示如下的错误信息: 编译器错误消息: CS0433: 类型“ASP.global_asax”同时存在于“c:\WINDOWS\Microsoft.NET\Fram ...
- Fence Repair POJ - 3253 (贪心)
Farmer John wants to repair a small length of the fence around the pasture. He measures the fence an ...
- django 利用pillow 进行简单的设置验证码(python)
1.导入模块 并定义一个验证状态 from PIL import Image, ImageDraw, ImageFont from django.utils.six import BytesIO de ...