C# Owin 创建与测试自己的中间件Middleware(二)
本文纯属介绍怎么简单地创建自己的Owin。还没有理解owin概念的请看上一篇文章:http://www.cnblogs.com/alunchen/p/7049307.html
目录
1.创建项目
2.导入Nuget包
3.创建Startup类
4.创建自己的中间件Middleware
5.把中间件加入owin
6.测试
7.总结
本文是以WebApi空项目来创建owin的。使用工具VS2017
1.创建项目
创建一个空的webapi项目
2.导入Nuget包
可以看到导入成功后,项目的引用多了下面的包。
3.创建Startup类
为什么要创建Startup类呢?
因为owin中有这样的规定:启动类定义为:Startup。在这个类中有一个Configuration方法,这是它的规定,owin会自动查找此类此方法并执行。
下面是我的Startup类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Owin;
using MyTestOwin.Middleware;
using Owin; [assembly: OwinStartup(typeof(MyTestOwin.Startup))]
namespace MyTestOwin
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
} }
}
4.创建自己的中间件Middleware
创建自己的中间件的话,首先要继承OwinMiddleware类,他是抽象类。可以看看此类上有什么内容:
此类主要有1个构造函数、1个属性、1个抽象方法。
构造函数OwinMiddleware:作用是初始化下一个可选的中间件。
属性Next:意思是下一个中间件。
抽象方法Invoke:创建自己的中间件都要重写此方法。此方法在中间件运行的时候就运行,处理个人请求。
下面我们来继承OwinMiddleware类,并且重构构造函数、重写Invoke方法。类名字为Middleware1
直接贴代码,没什么可说的,可以看注释:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Microsoft.Owin; namespace MyTestOwin.Middleware
{
public class Middleware1:OwinMiddleware
{ public Middleware1(OwinMiddleware next):base(next)
{ } public override Task Invoke(IOwinContext context)
{
if (context.Request.Path == new PathString("/owin1"))
{
var msg = "Owin1";
var msgBytes = Encoding.UTF8.GetBytes(msg);
context.Response.ContentType = "text/html;charset=utf-8";
context.Response.Write(msgBytes, , msgBytes.Length);
//解答者告诉Server解答已经完毕,后续Middleware不需要处理
return Task.FromResult();
}
//如果不是要处理的路径,那么交付后续Middleware处理
return Next.Invoke(context);
}
}
}
解析一下上面代码:
- 首先,我们判断一下请求的link是否为’/owin1’?
- 如果是,则执行我们想要的方法,并且执行完毕,后续所有的中间件以及controller等都不做执行处理。
- 如果不是,则执行下一个中间件,直到找到对应的中间件为止。如果中间件最后找不到,则到controller里面找。
下面理清一下:
- PathString是Miscrosoft.Owin下一个类,封装了URL处理的一些功能.
- Task.FromResult(0) 表示一个空的Task,说明该Middleware在某些情况下不再触发后续的Middleware运行—也就是”到此为止”.
- 最后Next.Invoke(context)是一个非常标准的实现,把上下文交付下一个Middleware继续处理—相当于”交出接力棒”.
- 这个Middleware是一个标准的解答者.它给出了”/owin1”这个问题的最终答案.
5.把中间件加入owin
下面我们把中间件Middleware1加入到owin中。
很简单,只需要在Startup类的Configuration方法中,加入下面的代码:
app.Use<Middleware1>();
6.测试
1)为了方便测试&理解,我们再加入一个中间件Middleware2类,并且执行owin2 的path,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Microsoft.Owin; namespace MyTestOwin.Middleware
{
public class Middleware2 : OwinMiddleware
{ public Middleware2(OwinMiddleware next):base(next)
{ } public override Task Invoke(IOwinContext context)
{
if (context.Request.Path == new PathString("/owin2"))
{
var msg = "owin2";
var msgBytes = Encoding.UTF8.GetBytes(msg);
context.Response.ContentType = "text/html;charset=utf-8";
context.Response.Write(msgBytes, , msgBytes.Length);
//解答者告诉Server解答已经完毕,后续Middleware不需要处理
return Task.FromResult();
}
//如果不是要处理的路径,那么交付后续Middleware处理
return Next.Invoke(context);
}
}
}
2)再在Startup类中加入自定义中间件:
app.Use<Middleware2>();
整体代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Owin;
using MyTestOwin.Middleware;
using Owin; [assembly: OwinStartup(typeof(MyTestOwin.Startup))]
namespace MyTestOwin
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
//注意:这里的顺序是与owin中间件类执行的顺序一样。
app.Use<Middleware1>();
app.Use<Middleware2>();
} }
}
3)在写一个继续ApiController的类,请求路径为:http://xx/api/values/get
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace MyTestOwin.Controllers
{
[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
[Route("get")]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
}
加上上面的所有东西,让我们更好地理解owin做了什么操作,与我们平时所写的apicontroller有什么联系。
下面,我们开始启动项目:
我们分别打一个断点在Startup类的方法Configuration中、Middleware1的Invoke方法、Middleware2的Invoke方法。
项目启动了,先执行Startup中的Configuration、再执行Middleware1、最后执行Middleware2。
请注意的是,这里的项目启动的路径是 http://localhost:52023/,并没有二级路径。上面都执行了中间件。
也就是说,我们的中间件注册后,所有的请求都经过我们的中间件。
测试一:在浏览器上输入 http://localhost:52023/api/values/get
第一执行Middleware1、第二执行Middleware2、最后是ValuesController。并且返回controller的结果:
测试二:在浏览器上输入 http://localhost:52023/owin1
第一执行Middleware1,最后也是它执行。返回结果是:
测试三:在浏览器上输入http://localhost:52023/owin2
第一执行Middleware1、最后执行Middleware2。返回结果是:
7.总结
我们通过自己的测试,可以总结到的是:
1)我们在startup类中注册的中间件顺序是中间件执行的顺序。
2)每个请求都会执行中间件的Invoke方法,直到有请求的结果为止。
3)从测试看出,中间件有点类似于拦截器。
可以到github上面下载项目 https://github.com/cjt321/MyTestOwin/
可以关注本人的公众号,多年经验的原创文章共享给大家。
C# Owin 创建与测试自己的中间件Middleware(二)的更多相关文章
- OWIN系列之自己动手编写中间件
一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. 2.OWIN.dll介绍 使用反编 ...
- 批量创建AD测试账号
在现场中,有时候客户会要求做一下AD压力测试,需要批量创建很多AD用户.奉献此代码供各位参考. 1: <# 2: 3: .DESCRIPTION 4: 批量创建AD测试账号 5: 6 ...
- soapui中文操作手册(二)----通过您的WSDL请求创建一个测试
1.通过您的WSDL请求创建一个测试 点击加号旁边的导航拓展项目树的Web服务,并选择请求: 在SoapUI Pro中,所述请求编辑出现在右边.SoapUI Pro有一个编辑器,它简化了XML的层 ...
- eos教程如何创建eos测试账号并且使用scatter插件
EOS代币租赁平台 --- Chintai平台已经在Jungle测试网络上部署了,欢迎大家来体验. 地址见: Chintai 公测版 官网是: Chintai 目前测试网络上面需要用到Scatter插 ...
- 3)创建,测试,发布 第一个NET CORE程序
工具:Visual Studio Code 或者 Visual Studio 环境:.NET CORE 2.0 VS Code很强大 当然支持netcore的开发,但是我还是选择更熟悉更强大的VS. ...
- 初探中间件(middleware)
初探中间件(middleware) 因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddlewa ...
- 如何传递参数给ASP.NET Core的中间件(Middleware)
问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...
- MySQL-ProxySQL中间件(二)| Admin Schemas介绍
目录 MySQL-ProxySQL中间件(一)| ProxySQL基本概念: https://www.cnblogs.com/SQLServer2012/p/10972593.html ...
- laravel框架的中间件middleware的详解
本篇文章给大家带来的内容是关于laravel框架的中间件middleware的详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. laravel中间件是个非常方便的东西,能将一些逻辑 ...
随机推荐
- [jquery] 遮罩弹窗,点击遮罩弹窗自动隐藏
$("#id_sign_forbidden_win .c-content").click(function(event){ event.stopPropagation(); // ...
- (leetcode162)find peak element
1题目 A peak element is an element that is greater than its neighbors. Given an input array where num[ ...
- SQL SERVER的锁机制(一)——概述(锁的种类与范围)
锁定:通俗的讲就是加锁.锁定是 Microsoft SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制. 定义:当有事务操作时,数据库引擎会要求不同类型的锁定,如相关数 ...
- 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)
从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...
- 自定义Chrome缩放比例
我想要设置Chrome页面缩放为120%,但是Chrome只提供110% 125%,根本没有让我舒心的缩放比例. 强迫症发作,谷歌了半天没有一个很好的解决方案. 虽然也有不少第三方扩展可以自定义缩放比 ...
- ContentControl as CC和ContentPresenter as CP的使用
1.CC为文本控件的父类,它继承为control,所以他是控件, 2.CP继承FrameworkElement,所以他是容器,相当于占位符 3.想让控件中能包含子控件就需要用CP,反之用CC就行.(不 ...
- ASP.NET MVC5 高级编程-学习日记-第三章 视图
开发人员之所以花费大量时间来重点设计控制器和模型对象,是因为在这些领域中,精心编写的整洁代码是开发一个可维护Web应用程序的基础. 3.1 视图的作用 视图的职责是向用户提供用户界面.当控制器针对被请 ...
- 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项。系统找不到指定的文件。
第一次发布MVC项目,打开网站 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项.系统找不到指定的文件. 问题原因:缺少配 ...
- 《基于MVC的JavaScript Web富应用开发》学习笔记
第1章 MVC和类 1. 什么是MVC? MVC是一种设计模式, 它将应用划分为3个部分: 数据(模型, Model), 展现层(视图, View) 和用户交互层(控制器, Controller). ...
- 小猴打架(luogu4430)(数论+生成树计数)
一开始森林里面有\(N\)只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过\(N-1\)次打架之后,整个森林的小猴 ...