摘要:本文目的是了解Owin基本原理。讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件

准备工作

首先通过VisualStudio创建一个控制台应用

然后添加Owin的Nuget包引用

需要的包如下

Owin
Microsoft.Owin
Microsoft.Owin.Hosting
Microsoft.Owin.Host.HttpListener

准备工作到此结束

编写OwinStartup类

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Run(HandleRequest);
}
static Task HandleRequest(IOwinContext context)
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello world from myOwin");
}
}

当OwinHost运行时,会首先加载Startup类,Configuration方法是必须有的,在Configuration方法中向Owin管道插入中间件,所有的请求都是中间件处理。

在这个Configurationapp.Run(HandleRequest);方法的作用是向管道中添加一个没有后续中间件的中间件,一般来讲一个Owin管道中有许多中间件,不同的中间件处理不同的事情,在处理结束后选择性的调用后面的中间件,例如某个身份验证中间件可以在验证失败时结束请求。而app.Run方法就是插如一个没有后续事项的中间件。稍后我们会编写常规的中间件。

这个中间件做的事很简单,就是向响应写入一个字符串,无论请求是什么结果都是一样的。

在Main方法中启动Host

static void Main(string[] args)
{
var url = "http://localhost:8080/";
var opt = new StartOptions(url); using (WebApp.Start<Startup>(opt))
{
Console.WriteLine("Server run at " + url + " , press Enter to exit.");
Console.ReadLine();
}
}

StartOptions类用来指定一些启动参数,最少应该指定一个url,这里一并指定了使用8080端口

启动程序控制台输出如下

Server run at http://localhost:8080/ , press Enter to exit.

用浏览器打开 http://localhost:8080/

效果如下:

`Hello world from myOwin`

尝试更改路径你得到的始终是一个结果

你可以尝试将Configuration中的代码注释掉,在运行程序,这是访问将得到空页面,Http代码也将是404,因为Owin管道中没有中间件处理请求。

编写中间件

我们编写一个名为Ding的中间件

public class DingMiddleware : OwinMiddleware
{
public DingMiddleware(OwinMiddleware next) : base(next)
{
} public override Task Invoke(IOwinContext context)
{
if (context.Request.Path.Value.Equals("/home/index"))
{
context.Response.Write("hello world from home/index");
}
if (Next != null)
{
return Next.Invoke(context);
}
return Task.CompletedTask;
}
}

这个中间件在检测到访问路径是/home/index时向Response中写入一句话,然后检测是否有下一个中间件,如果有就调用。

添加中间件到Configuration

可以直接在Configuration中加入app.Use<DingMiddleware>()来插入中间件,但是我们一般使用扩展方法来做这件事。

public static class MyMidlewareExtention
{
public static IAppBuilder UseDing(this IAppBuilder app)
{
return app.Use<DingMiddleware>();
}
}

修改Configuration中的代码:

public void Configuration(IAppBuilder app)
{
app.UseDing();
app.Run(HandleRequest);
}

现在管道中有两个中间件了,现在运行程序,在地址栏中输入http://localhost:8080/home/index将得到如下结果

hello world from home/indexHello world from myOwin

因为Ding中间件在处理之后继续调用了接下来的中间件

输入其他路径将得到Hello world from myOwin这个结果

如果将Configuration中的两个中间件位置调换,的到的结果只有一个Hello world from myOwin,因为app.Run(HandleRequest);不执行后续的中间件。

第二个中间件

public class DiDiDiMiddleware : OwinMiddleware
{
public DiDiDiMiddleware(OwinMiddleware next) : base(next)
{
} public override Task Invoke(IOwinContext context)
{
if (context.Request.QueryString.Value == "boom")
{
context.Response.Write("Boom! Boom! Boom!");
return Task.CompletedTask;
}
if (Next != null)
{
return Next.Invoke(context);
}
return Task.CompletedTask;
}
}

这个中间件在地址栏QueryString(?后边的部分)等于boom时结束请求。

MyMidlewareExtention代码修改如下:

public static class MyMidlewareExtention
{
public static IAppBuilder UseDing(this IAppBuilder app)
{
return app.Use<DingMiddleware>();
}
public static IAppBuilder UseDiDiDi(this IAppBuilder app)
{
return app.Use<DiDiDiMiddleware>();
}
}

Startup类修改如下:

public class Startup
{
public void Configuration(IAppBuilder app)
{ app.UseDiDiDi();
app.UseDing();
}
}

这里去掉了app.Run此时,对于非/home/index的请求会得到404,所以我们暂时改动下代码将HandleRequest方法封装成一个默认的中间件

代码改动如下:

public class DefaultMiddleware : OwinMiddleware
{
public DefaultMiddleware(OwinMiddleware next) : base(next)
{
} public override Task Invoke(IOwinContext context)
{
var path = context.Request.Path.Value;
context.Response.Write($"hey you come from {path}!");
return Task.CompletedTask;
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseDiDiDi();
app.UseDing();
app.UseDefault();
}
}

运行程序观察结果是否符合预期。

当地址中含有?boom时会的到一个Boom!Boom!Boom!

总结:Owin的管道概念其实简单易懂,在程序启动之前,向里面插入中间件,中间件决定请求是否继续向下走。在管道中的中间件可以拿到请求的所有信息以对请求进行处理,管道里的中间件执行结束之后,这个请求就被处理完成了,然后发回浏览器。

Owin中间件动手做的更多相关文章

  1. Owin中间件动手玩

    摘要:本文目的是了解Owin基本原理.讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件 准备工作 首先通过VisualStudio创建一个控制台应用 然后添加Owin的Nuge ...

  2. owin 中间件 katana 如何解密cookie

    .NET MVC5 默认的用户登录组件是AspNet.Identity ,支持owin,并且微软自己实现的一套owin 中间件叫 katana 补充一下 katana项目源码地址:https://ka ...

  3. Owin中间件搭建OAuth2.0认证授权服务体会

    继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...

  4. 动手做第一个Chrome插件

    Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...

  5. IP工具类-自己动手做个ip解析器

    IP工具类-自己动手做个ip解析器 一.资料准备 导入依赖包:

  6. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  7. [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  8. 自己动手做AI:Google AIY开发工具包解析

    2018年国际消费性电子展(CES)上,最明显的一个趋势是Amazon与Google的语音技术进驻战,如AmazonAlexa进驻到Acer笔电内,Google Assist进驻到KIA汽车内,其他如 ...

  9. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

随机推荐

  1. 云平台项目--学习经验--回调函数中call和apply

    Js中可以通过call和apply来代替另一个对象调用一个方法,将一个函数对象上下文从初始上下文改变为thisObj指定的新对象.简而言之,改变函数执行的上下文,而call和apply的基本区别在于他 ...

  2. 团队作业4——WBS练习

    一.作业要求 对团队项目进行任务分解 —要求所有人共同参与 队长列出需求 成员进行估计 队长领导大家达成共识 形成团队报告,发至团队博客 注意:分解的粒度最小不应超过6小时(即一个人在6小时以内能够完 ...

  3. createobjbyreplace(str,arr) js替换方法保存

    <script> function createobjbyreplace(str,arr){ var len = arr.length; for(var i=0; i<len; i+ ...

  4. 重启Hbase命令

    注意先启动hadoop,记得重启zookeeper. 具体操作如下: cd hadoop-2.7.4/sbin/ && ./stop-all.sh && ./start ...

  5. HTTP 返回的状态码 != 200 ,浏览器不会将返回的内容缓存到本地磁盘上

    今天无意发现的,以前处理HTTP State = 404或403之类的,都是直接返回 HTTP 200 OK,然后加一个缓存设置,例如: Cache-Control: max-age=3600 最近修 ...

  6. Strassen矩阵乘法之思考

    可不可以有另外的划分小矩阵的方法? A*B=C A/B分成n*m个矩阵 可看成一个多元方程. Ci,k = Ai,j * Bjk 每一个Ci,k看成方程的一个未知数 每一个小式子:对于A或B同一列/行 ...

  7. maven pom 中的 build——resources 标签 mybatis加载mapper类及.xml文件

    转: maven 理解 2017年12月18日 15:34:31 feicongcong 阅读数:5658   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  8. CentOS6.7定制化制作ISO

    CentOS6.7定制化制作ISO 以CentOS 6.7-minimal为例. 欢迎大家转载,并保留原文出处.内容若有错误或补充,请联系:szyzln@126.com 本文主要讲解如何在已有官方Ce ...

  9. 个推应用统计产品(个数)Android集成实践

    前段时间,我们公司的产品又双叒叕给我们提了新需求,要求我们把APP相关的数据统计分析一下,这些指标包括但不限于应用每日的新增.活跃.留存率等等,最好每天都能提供数据报表.这种事情真是想想就麻烦,大家最 ...

  10. 在ajax请求后台时在请求标头RequestHeader加token

    情景:为了保证系统数据的安全性,一般前后台之间的数据访问会有授权与验证,这里的Token机制相对于Cookie支持跨域访问,在RESTful API里面,验证一般可以使用POST请求来通过验证,使服务 ...