[ASP.NET] 下一代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类
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方法
using (WebApp.Start<Startup>("http://localhost:12345"))
{
Console.ReadLine();
}
创建Startup类
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)
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
public class HelloMiddlerware : OwinMiddleware
{
public HelloMiddlerware(OwinMiddleware next)
: base(next)
{
} public override Task Invoke(IOwinContext context)
{
context.Response.Write("hello"+DateTime.Now);
//管道继续往下走
return Next.Invoke(context);
}
}
Startup
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>();
}
}
来看一下组件的执行顺序
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 节点设置
<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] 下一代ASP.NET开发规范:OWIN的更多相关文章
- 下一代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开发规范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
ASP.NET开发规范:OWIN 今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 ...
- ASP.NET Core 1.0 开发记录
官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
- ASP.Net的两种开发模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- cWeb开发框架,基于asp.net的cWeb应用开发平台介绍(二)
cWeb是基于微软的.Net Framework 4框架,数据库是sql server 2008 r2. cWeb开发框架下载,点击这里去下载. cWeb开发框架借鉴三层架构理论分为三层,分别是:cD ...
随机推荐
- [算法导论]二叉查找树的实现 @ Python
<算法导论>第三版的BST(二叉查找树)的实现: class Tree: def __init__(self): self.root = None # Definition for a b ...
- dubbo 管理控制台 的安装 dubbo-admin
按照官方文档来,只是官方文档中提供的war包无法下载,我的环境至少是这样,不知道其他网络环境是否OK. war包下载地址:链接: http://pan.baidu.com/s/1i32fs7j 密码: ...
- 【字符串排序】n个数连接得到最小或最大的多位整数
题目 描述:设有n个正整数,将它们依次连成在一排,组成一个多位数,现在要求可能组成的多位数中最大的多位数是什么? 例如:n=3时,3个整数13,312,343连成的最大多位数为:343-312-13. ...
- SVM实现多分类的三种方案
SVM本身是一个二值分类器 SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器. 目前,构造SVM多类分类器的方法主要有两类 (1)直接法,直接在目标函数上进行修改,将 ...
- 翻译--Blazing fast node.js: 10 performance tips from LinkedIn Mobile
1.避免使用同步代码: // Good: write files asynchronously fs.writeFile('message.txt', 'Hello Node', function ( ...
- 如何使Session永不过期
转载:http://blog.csdn.net/wygyhm/article/details/2819128 先说明情况:公司做监控系统,B/S结构,主要用在局域网内部!监控系统开机可能要开好长时间, ...
- "无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开"解决办法
当程序用ado的jet4.0方式连接mdb数据库的时候,对于设有access数据库密码的mdb的访问居然报错“无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开”. ADOConne ...
- 定时5秒之后驻留在元素ID为content元素的内容
如果我只能刷新一个特定的页面的一部分,这将是很大的,例如:仪表盘上的交通灯显示系统状态. 这是很容易通过使用jQuery JavaScript库,只刷新页面的一部分.一旦我们纳入我们的页面的jQuer ...
- 基于LoadRunner构建接口测试框架
基于LoadRunner构建接口测试框架 http://www.docin.com/p-775544153.html
- [Tip] 如何在BeyondCompare中忽略不重要的区别.
在使用BeyondCompare时,有时需要忽略一些不重要的区别,下面的链接教你如何通过定义语法元素来实现这个功能. http://www.scootersoftware.com/support.ph ...