摘要:本文目的是了解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管道插入中间件,所有的请求都是中间件处理。

在这个Configuration中app.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. ajax异步导致js方法顺序执行不了

    js两个方法调用的顺序,有时候是这样的 f1(); f2(); 本来是先执行f1的,但是如果f1里面进行ajax异步    async:true,那么可能会先执行f2,如果想要顺序执行,那么就把异步设 ...

  2. SDN网路虚拟化平台概述

    SDN网络虚拟化平台是介于物理网络拓扑以及控制器之间的中间层.虚拟化平台主要是完成物理网络拓扑到虚拟网络资源的映射,管理物理网络,并向租户提供相互隔离的虚拟网络. 为了实现网络虚拟化,虚拟化平台首先需 ...

  3. 关于java中指针的概念

    今天寡人遇到一个问题,扫描非关系数据库中的图(由node和rel组成),将其转化成由寡人自定义的gnode和gedge组成的图. gnode类包含结点的id,label和包含此gnode的gedge的 ...

  4. 单片机pc指针

    单片机的PC是指程序计数器(Program Counter).程序计数器PC用于存放下一条将要执行的指令地址,是一个16位专用寄存器,不能通过MOV指令来操作,对用户来说是不可见的.当执行一条指令时, ...

  5. 如何判断可见字符 Unicode

    一个Unicode字符串,如何判断其中都是可见字符? //根据国标 GB2312 的中文汉字及符号 区位码的范围判断 Function CheckIsGB2312(Char : WideChar) : ...

  6. Jquery ajax 完整实例子1

    $ajax请求--------------------------------- var $personWifePs=$("#wife-money tbody tr"); var ...

  7. Windows 64位环境的Java 服务配置

    有个任务,需要远程起调Windows64服务器下的程序,那么需要在Windows服务器中注入一个deamon服务,都知道Linux环境做成后台服务非常简单,nohup &很快能解决问题,但wi ...

  8. 【设计模式】—— 访问者模式Visitor

    前言:[模式总览]——————————by xingoo 模式意图 对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同.此时,就是访问者模式的典型应用了. 应用场景 1 不同的子类 ...

  9. 学习Spring Boot:(十三)配置 Shiro 权限认证

    经过前面学习 Apache Shiro ,现在结合 Spring Boot 使用在项目里,进行相关配置. 正文 添加依赖 在 pom.xml 文件中添加 shiro-spring 的依赖: <d ...

  10. sql server 小技巧(5) Sql server 获取指定字符后的所有字符 - 去掉指定字符前的所有字符

    select top 10  SUBSTRING( sproductcode, CHARINDEX('-', SProductCode)+1, LEN(SProductCode)) from csmr ...