OWIN编写中间件
OWIN系列之自己动手编写中间件
一、前言
1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器。
2.OWIN.dll介绍
使用反编译工具打开Owin.dll,你会发现类库中就只有一个IAppBuilder接口,所以说OWIN是针对.NET平台的开放Web接口。
3.Microsoft.Owin.dll
Microsoft.Owin.dll是微软对Owin的具体实现,其中就包括我们今天的主题"中间件"。下文将使用代码描述自定义基于Owin的"中间件"。
二、环境准备
1.Visual Studio 2015 Update1
2.tinyfox-2.3.2-common --用作Owin Host
三、项目基架搭建和介绍
1.创建一个空的Web站点,移除除了System的所有引用
2. 使用NuGet命令安装安装Microsoft.Owin
PM> Install-Package Microsoft.Owin
3.安装成功后的引用,可以看到,Owin.dll是依赖项,所以自动下载

图1 所有引用
4.查看Owin.dll结构和IAppBuilder接口代码

图2 Owin.dll结构

图3 IAppBuilder接口代码
5.OwinMiddleware介绍
OwinMiddleware 是位于Microsoft.Owin.dll中的一个抽象类,我们会用到OwinMiddleware中的Next,简单的说就是当前中间件无法匹配请求则会将请求转向下一个中间件处理,直至成功处理,当然这个取决你的程序中是否有转向代码,下文中将详细介绍。

四、自己动手编写中间件
1.新建类MyMiddleware继承OwinMiddleware并且实现Invoke函数,附代码;在Invoke中根据不同的URL PATH调用不同的处理方法

1 /// <summary>
2 /// OWIN "中间件" - MyMiddleware
3 /// </summary>
4 public class MyMiddleware : OwinMiddleware
5 {
6
7
8 /// <summary>
9 /// 构造函数,第一个参数必须为 OwinMiddleware对象 ;第一个参数是固定的,后边还可以添加自定义的其它参数
10 /// </summary>
11 /// <param name="next">下一个中间件</param>
12 public MyMiddleware(OwinMiddleware next)
13 : base(next)
14 {
15
16 }
17
18
19 /// <summary>
20 /// 处理用户请求的具体方法,该方法是必须的
21 /// </summary>
22 /// <param name="c">OwinContext对象</param>
23 /// <returns></returns>
24 public override Task Invoke(IOwinContext c)
25 {
26 if (Next != null && c.Request.Path.Value != "/home/index")
27 {
28
29 var message1 = "NotFound\r\n";
30 var outbytes1 = Encoding.UTF8.GetBytes(message1);
31 c.Response.ContentType = "text/html; charset=utf-8";
32 c.Response.Write(outbytes1, 0, outbytes1.Length);
33 return Next.Invoke(c);
34 }
35
36 // var urlPath = c.Request.Path;
37 // switch (urlPath) {
38 // ..........
39 // ..........
40 // 可以根据不同的URL PATH调用不同的处理方法
41 // 从而构成一个完整的应用。
42 // }
43
44
45 var message = "Welcome to My Home!";
46 var outbytes = Encoding.UTF8.GetBytes(message);
47 c.Response.ContentType = "text/html; charset=utf-8";
48 c.Response.Write(outbytes, 0, outbytes.Length);
49
50 return Task.FromResult<int>(0);
51 }
52
53
54
55 }

介绍:
1.构造函数第一个参数必须为 OwinMiddleware对象,可从Microsoft.Owin.dll源码得知,这里不作话题。
2.我们在上面提到了“如果当前中间件无法匹配请求则会将请求转向下一个中间件处理”,上面的代码中的if如果成立,执行returnNext.Invoke(c);后会找注册的下一个中间件,如果url匹配,会正确执行,并且执行return Task.FromResult<int>(0);结束当前请求。
2.新建类MyMiddleware2继承OwinMiddleware并且实现Invoke函数,之所以建立两个中间件,是为了演示”如果当前中间件无法匹配请求则会将请求转向下一个中间件处理",同样附上代码

1 /// <summary>
2 /// OWIN "中间件" - MyMiddleware2
3 /// </summary>
4 public class MyMiddleware2 : OwinMiddleware
5 {
6
7
8 /// <summary>
9 /// 构造函数,第一个参数必须为 OwinMiddleware对象 ;第一个参数是固定的,后边还可以添加自定义的其它参数
10 /// </summary>
11 /// <param name="next">下一个中间件</param>
12 public MyMiddleware2(OwinMiddleware next)
13 : base(next)
14 {
15 }
16
17
18 /// <summary>
19 /// 处理用户请求的具体方法,该方法是必须的
20 /// </summary>
21 /// <param name="c">OwinContext对象</param>
22 /// <returns></returns>
23 public override Task Invoke(IOwinContext c)
24 {
25
26 if (Next != null && c.Request.Path.Value != "/user")
27 {
28
29 var message1 = "NotFound2!\r\n";
30 var outbytes1 = Encoding.UTF8.GetBytes(message1);
31 c.Response.ContentType = "text/html; charset=utf-8";
32 c.Response.Write(outbytes1, 0, outbytes1.Length);
33 return Task.FromResult(0);
34 }
35
36 // var urlPath = c.Request.Path;
37 // switch (urlPath) {
38 // ..........
39 // ..........
40 // 可以根据不同的URL PATH调用不同的处理方法
41 // 从而构成一个完整的应用。
42 // }
43
44
45 var message = "I'm MyMiddleware2";
46 var outbytes = Encoding.UTF8.GetBytes(message);
47 c.Response.ContentType = "text/html; charset=utf-8";
48 c.Response.Write(outbytes, 0, outbytes.Length);
49
50 return Task.FromResult<int>(0);
51 }
52
53
54
55 }

3.中间件注册类,代码如下:

/// <summary>
/// 这个类是为AppBuilder添加一个名叫UseMyApp的扩展方法
/// </summary>
public static class MyExtension
{
public static IAppBuilder UseMyApp(this IAppBuilder builder)
{
return builder.Use<MyMiddleware>();
//UseXXX可以带多个参数,对应中间件构造函数中的第2、3、....参数;
}
public static IAppBuilder UseMyApp2(this IAppBuilder builder)
{
return builder.Use<MyMiddleware2>();
//UseXXX可以带多个参数,对应中间件构造函数中的第2、3、....参数;
}
}

用过第三方Owin框架如Nancyfx的朋友是不是感觉比较熟悉,使用UseXXX()
4.注册中间件,新建Startup类

1 public class Startup
2 {
3 public void Configuration(IAppBuilder app)
4 {
5
6 app.UseMyApp();
7
8 app.UseMyApp2();
9
10 }
11 }

备注:为了达到演示的目的,必须注意注册时的顺序,我们的Next.Invoke(c)是在MyMiddleware中编写的而不是MyMiddleware2,所以必须让MyMiddleware先执行,否则在MyMiddleware2 中遇到return Task.FromResult<int>(0);则直接结束当前请求。当然你也可以更换顺序试试,后面会附上源码下载
5.到目前为止,我们的代码已经写好,配置好TinyFox准备测试,如果不知道Tinyfox作为OwinHost如何调试请参考http://www.cnblogs.com/gaobing/p/4969581.html。
五、测试与总结, 并附上测试图
1.不匹配的url

2.匹配的中间件2的url

3.匹配中间件1的url

备注:之所以不执行中间件2,是因为成功匹配url,所以直接return Task.FromResult<int>(0);结束当前请求
六、源码地址
七、学习交流群
ASP.NET Linux & OWIN QQ 群:468859699
NET & OWIN & VNext QQ 群: 199281001
OWIN编写中间件的更多相关文章
- OWIN系列之自己动手编写中间件
一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. 2.OWIN.dll介绍 使用反编 ...
- Owin 自定义中间件(2)中间件进阶
前面一篇文章简单的介绍了中间件的应用 下面编写一个自定义的中间件类库,并加入中间件参数以及引入日志记录中间件的异常 下面来看下中间件的构造,参数可以自定义 这里我定义了一个参数类 编写中间件需要引入 ...
- scrapy进阶-编写中间件和扩展
中间件: 主要讨论的是下载中间件,明确一下顺序: download_middlewares --> server.url ---> spider_middleware 我主 ...
- Owin 自定义中间件
/// <summary> /// 自定义的中间件 /// </summary> public class CustomMiddleware : OwinMiddleware ...
- Owin中间件动手玩
摘要:本文目的是了解Owin基本原理.讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件 准备工作 首先通过VisualStudio创建一个控制台应用 然后添加Owin的Nuge ...
- Owin中间件动手做
摘要:本文目的是了解Owin基本原理.讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件 准备工作 首先通过VisualStudio创建一个控制台应用 然后添加Owin的Nuge ...
- 使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- 我怎么忽略了身份框架魔法,只是使用OWIN验证的中间件,以获得要求我寻求什么呢?
该OWIN中间件的东西第三方登录集成到您的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何就剜出来的新的ID,它取代了蹩脚的成员身份 API.我没有兴趣在坚持所产生的债权,并在英法为基础的数据 ...
随机推荐
- Wamp 访问本地站点慢 的解决办法
自从安装了64位的windows 8.1之后,电脑运行速度变快了,可是重新下载安装64位的WAMP,访问本地的WEB站点确是很慢,根本不像是在本地访问,经过在WAMP论坛上搜索,终于找到了解决办法,主 ...
- 破解phpjm.net加密,解密程序,全部公布
原文:破解phpjm.net加密,解密程序,全部公布 2014-05-23更新: 很久没人找我解密了,看来这加密已过时,现公布我这边最新的解密工具. 若有解不出的可联系qq: 267014855 (不 ...
- hdu 1086(判断线段相交)
传送门:You can Solve a Geometry Problem too 题意:给n条线段,判断相交的点数. 分析:判断线段相交模板题,快速排斥实验原理就是每条线段代表的向量和该线段的一个端点 ...
- Everything You Wanted to Know About Machine Learning
Everything You Wanted to Know About Machine Learning 翻译了理解机器学习的10个重要的观点,增加了自己的理解.这些原则在大部分情况下或许是这样,可是 ...
- 关于jdbc注冊驱动的那点事
看到非常多人写jdbc连接工具类的时候,都会写到Class.forName()去显示载入类,一写错点点就会抛出ClassNotFoundException,关于显示载入类,究竟会不会产生作用呢? 參考 ...
- MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白
MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白,症状例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVVAxOT ...
- poj2479(dp)
题目链接:http://poj.org/problem?id=2479 题意:求所给数列中元素值和最大的两段子数列之和. 分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和. 从右往左扫一遍, ...
- python手记(46)
#!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:myhaspl@qq.com ...
- Struts2第一个工程helloStruts极其基本配置
前面已经准备好了Struts-2.3.15,现在就可以直接搭建Struts2的工程了.前面http://blog.csdn.net/huangchnegdada/article/details/917 ...
- IE浏览器审查密码的清除
上周去188工业区,总装厂的喷油部的电脑上被谁设置了IE的审查密码,后来通过电话沟通,运维岗给出了具体的解决方法: 进入注册表HKEY_LOCAL_MACHINE\Software\Microsoft ...