ASP.NET开发规范:OWIN
ASP.NET开发规范:OWIN
今天投简历 准备面试了...
本节目录:
OWIN简介
OWIN(Open Web Interface For .Net)
OWIN是.Net开源社区借鉴Ruby而制定的.Net Web开发架构,有着非常简单的规范定义,目标是用于解耦Web Server和Web Application.
ASP.NET的局限性
ASP.NET核心是System.Web,而System.Web紧耦合IIS.IIS绑定在Windows OS上,所以ASP.NET 无法跨平台.
System.Web是.NET Framework重要组成,所以System.Web更新需要等待.NET的发布
OWIN规范
OWIN定义了4层:
2
Host:主要负责应用程序的配置和启动进程,包括初始化OWIN Pipeline、运行Server。
Server:绑定套接字并监听的HTTP请求然后将Request和Response的Body、Header封装成符合OWIN规范的字典并发送到OWIN Middleware Pipeline中
Middleware:称之为中间件、组件,位于Server与Application之间,用来处理发送到Pipeline中的请求
Application:这是具体的应用程序代码,只不过我们将他们注册到OWIN Pipeline中去处理HTTP 请求,成为OWIN管道的一部分
OWIN接口
Func<IDictionary<string, object>, Task>;
用于Server和Middleware的交互。他并不是严格意义上的接口,而是一个委托并且每个OWIN中间件组件必须提供。
其中参数类型为IDictionary<string,object>的变量为环境变量
Katana
微软引入并推广OWIN,同时依照OWIN规范,实现了Katana。
Host
宿主只是一个进程,是整个OWIN程序的载体。这个宿主可以是IIS, IIS Express, Console, Windows Service等。
Katana为我们提供了3中选择:
- IIS / ASP.NET :使用IIS是最简单和向后兼容方式,在这种场景中OWIN Pipeline通过标准的HttpModule和HttpHandler启动。使用此Host你必须使用System.Web作为OWIN Server
- Self-Host :如果你想要使用其他Server来替换掉System.Web,并且可以有更多的控制权,可以选择创建一个自定义宿主,如使用Windows Service、控制台应用程序、Winform来承载Server
- OwinHost :也可以使用Katana提供的OwinHost.exe:他是一个命令行应用程序,运行在项目的根部,启动HttpListener Server并找到基于约束的Startup启动项
Server
负责绑定到 TCP 端口,监听端口发送过来的请求,同时将请求的信息依照OWIN规范,包装成字典格式,传递到下层的Middleware
Katana对OWIN Server的实现分为如下几类:
- System.Web:当使用IIS作为Host时,System.Web把自己注册为HttpModule和HttpHandler并且处理发送给IIS的请求(Microsoft.Owin.Host.SystemWeb)
- HttpListener:这是OwinHost.exe和自定义Host默认的Server。(Microsoft.Owin.Host.HttpListener)
- WebListener:这是ASP.NET vNext默认的轻量级Server,他目前无法使用在Katana中
Middleware
这是为组成 OWIN 管道中的组件。
Middleware可以理解为提供Func<IDictionary<string, object>, Task>接口的组件。
Katana提供了一个OwinMiddleware基类更加方便我们继承来实现OWIN Middleware.
Application
具体的代码实现,比如ASP.NET Web API、SignalR具体代码的实现。
事实上,对于这些类型的应用程序,Katana 组件只需使用一个小的配置类即可见。
Hello World
IIS-Host
新建一个空的Web项目,Nuget引用Microsoft.Owin.Host.SystemWeb
创建Startup类
1
2
3
4
5
6
7
8
9
10
11
|
public class Startup { public void Configuration(IAppBuilder app) { app.Run(context => { context.Response.ContentType = "text/plain" ; return context.Response.WriteAsync( "Hello World!" ); }); } } |
访问项目地址:http://localhost:xx
Self-Host
新建控制台项目,Nuget引用Microsoft.Owin.SelfHost
Main方法
1
2
3
4
|
创建Startup类
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Startup { public void Configuration(IAppBuilder app) { #if DEBUG //诊断 app.UseErrorPage(); #endif //欢迎页 //app.UseWelcomePage("/"); app.Run(x=>x.Response.WriteAsync( "hello world" )); } } |
访问地址:http://localhost:12345
OWIN-Host
新建类库项目,Nuget引用OwinHost
创建Startup类(需要程序集Owin和Microsoft.Owin)
1
2
3
4
5
6
7
8
9
10
11
|
public class Startup { public void Configuration(IAppBuilder app) { app.Run(context => { context.Response.ContentType = "text/plain" ; return context.Response.WriteAsync( "Hello World!" ); }); } } |
OwinHost.exe
这里需要注意
- Nuget下载完,OwinHost.exe会在package文件夹里
- OwinHost.exe会加载./bin文件夹下的程序集作为server assembly
所以我们将这OwinHost.exe3个文件移动到
=>
另外将Debug或者Release文件夹下的文件移动到bin文件夹下
cmd运行OwinHost.exe
访问:http://localhost:5000/
自定义Middleware
Middleware非常类似于HttpModule,会注册到Owin的pipeline中执行代码.
继承OwinMiddleware
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class HelloMiddlerware : OwinMiddleware { public HelloMiddlerware(OwinMiddleware next) : base (next) { } public override Task Invoke(IOwinContext context) { context.Response.Write( "hello" +DateTime.Now);<br> //管道继续往下走 return Next.Invoke(context); } } |
Startup
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Startup { public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888 //管线自由组合 app.Use<HelloMiddlerware>(); //Run是插入一个中间件,并终止继续往下流 app.Run(x => x.Response.WriteAsync( "good" )); //此中间件将不执行 app.Use<HelloMiddlerware>(); } } |
来看一下组件的执行顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class Startup { public void Configuration(IAppBuilder app) { app.Use((x, next) => { x.Response.ContentType = "text/html" ; return next.Invoke(); }); app.Use((x, next) => { x.Response.WriteAsync( "1 Before" ); next.Invoke(); return x.Response.WriteAsync( "1 After" ); }); app.Use((x, next) => { x.Response.WriteAsync( "2 Before" ); next.Invoke(); return x.Response.WriteAsync( "2 After" ); }); app.Run(x => x.Response.WriteAsync( "<br/>hello world<br/>" )); } } |
浏览结果:
扩展
Startup类如何被关联
1.默认名称匹配
可以定义Startup.cs类,只要这个类的namespace和Assembly的名称相同。那么,这个Startup.cs中的Configuration方法,就会在OWIN管道初始化的时候执行。
2.使用OwinStartup Attribute
这就是我们例子中使用的方式,直接指定哪个具体类是Startup类。
3.在配置文件的appSetting 节点设置
1
2
3
|
<appSettings> <add key= "owin:appStartup" value= "StartupDemo.ProductionStartup" /> </appSettings> |
Pipeline
Owin的pipeline在IIS Host上本质是注册到Httpapplication的pipeline上.
如:app.UseStageMarker(PipelineStage.Authenticate);
本文参考:
http://www.cnblogs.com/JustRun1983/p/3955238.html
Katana:http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana
ASP.NET开发规范:OWIN的更多相关文章
- 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍
随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katan ...
- <转>下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍
2014-09-04 07:22 by JustRun http://www.cnblogs.com/JustRun1983/p/3955238.html 随着VS2013的发布,微软在Asp.Net ...
- 下一代Asp.net开发规范OWIN(3)—— Middleware
Middleware是OWIN管道的基本组成单元,最后拼接的OWIN管道来处理客户端请求,输出网页.这篇文章,首先看看Web Form, MVC, Web API如何结合OWIN使用. 然后将如何编写 ...
- 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用
接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中. 阅读目录: 一. Katana项目的结构和 ...
- [ASP.NET] 下一代ASP.NET开发规范:OWIN
今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 OWIN(Open Web Int ...
- ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上
一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...
- C#开发规范总结(个人建议)
.NET开发编程规范 章程序的版式 版式虽然不会影响程序的功能,但会影响可读性.程序的版式追求清晰.美观,是程序风格的重要构成因素. 可以把程序的版式比喻为"书法".好的" ...
- 转载 C#中敏捷开发规范
转载原地址 http://www.cnblogs.com/weixing/archive/2012/03/05/2380492.html 1.命名规则和风格 Naming Conventions an ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
随机推荐
- http协议知识整理(转)
HTTP 协议 作为web开发人员,了解一些http协议的知识很有必要.本文简单介绍了HTTP协议的知识,若有错误的地方,望大家指正. 1.HTTP协议是什么? http协议是一个应用层的协议.规定了 ...
- kafka解释三的具体:发展Kafka应用
一个.整体外观Kafka 我们知道.Kafka系统有三大组件:Producer.Consumer.broker . producers 生产(produce)消息(message)并推(push)送给 ...
- restrictkeyword
今天在移植ffmpeg到opencore时出现一个编译错误: /libavcodec/dsputil.c:545: error: expected ';', ',' or ')' before 'bl ...
- sitemap.xml
内部类 在类内部的类 1.解决多继承 2.解决继承和实现接口时候方法名冲突情况 3.实现数据隐藏 只有内部类可以拥有4种访问修饰符 当内部类为private的时候,有外部类提供方法来访问内部类 常规 ...
- 网站上flv,MP4等格式的视频文件播放不出来的解决办法
在做一个网站时,发现视频文件,比如flv,MP4格式在本地可以正常的播放,但是传到了开发机器上,就不行了.播放器的文件地址是对的,就是一直没有反应. 经过长时间的实验,发现问题在与iis的设置问题.i ...
- 搬寝室 hdu
Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...
- Linux下yum订购具体解释
1.描述 yum = Yellow dog Updater, Modified/删除/更新RPM包.它能自己主动解决包的倚赖性问题.类似于Ubuntu的apt.它能便于管理大量系统的更新问题. 配置文 ...
- poj 3237 Tree(树链拆分)
题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...
- C指针决心 ------ 指针的概念和元素
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 指针在C语言中的地位,不用多说. 指针的概念 指针是一个特殊的变量,它里面存储 ...
- 花生壳宣布网站的网址直接绑定到详细的项目——jboss版本
花生壳公布,首先要有域名.然后激活域名,详细的公布就不说了,网上有非常多资料,这里是在jboss下直接将网址与详细的项目相应.做法有点不地道 假设跟图上一样配置的话.訪问网址相当于訪问的是http:/ ...