摘要:本文目的是了解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. 使用Owin中间件搭建OAuth2.0认证授权服务器

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

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

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

  6. owin中间件

    public class HelloWorldOptions { public HelloWorldOptions() { IncludeTimestamp = true; Name = " ...

  7. 构建 Owin 中间件 来获取客户端IP地址

    Not so long ago, we discussed on this blog the possible ways of retrieving the client’s IP address i ...

  8. 动手玩转Docker(一)

    在学习docker之前,先了解一下什么是docker,以及docker技术存在的意义. Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上 ...

  9. [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”

    NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...

随机推荐

  1. 用shell脚本新建shell文件并自动生成头说明信息

    目标: 新建文件后,直接给文件写入下图信息 代码实现: [root@localhost test]# vi AutoHead.sh #!/bin/bash#此程序的功能是新建shell文件并自动生成头 ...

  2. C#生成Code128码

    using System; using System.Collections.Generic; using System.Data; using System.Drawing; namespace C ...

  3. MySql5.7创建数据库与添加用户、删除用户及授权

    MySql安装启动成功后(不会的可以查看上篇MySql5.7安装及配置),首先我们需要创建数据库,然后创建一个用户去操作这个数据库: 一.创建数据库 在MySql命令行中输入: create data ...

  4. VUE长按事件

    PS:在开发中常常会有长按事件的需求,这里我简单的介绍几种长按事件的需求 需求一:长按数字累加或者累减 HTML: <div class="mui-numbox" data- ...

  5. win10 uwp 拖动控件

    我们会使用控件拖动,可以让我们做出好看的动画,那么我们如何移动控件,我将会告诉大家多个方法.其中第一个是最差的,最后的才是我希望大神你去用. Margin 移动 我们可以使用Margin移动,但这是w ...

  6. Linux下PHP连接MS SQLServer的办法

    Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般 ...

  7. MVC(一)-MVC的基础认知

    MVC是一种编程模式和设计思想,MVC大致切割为三个主要单元:Model(实体模型),View(视图),Contrller(控制器),MVC主要目在于简化软件开发的复杂度,让程序代码形成一个松耦合. ...

  8. C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符

    C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符如果PLSQL Develope能连接上而用代码无法连接上则可以考虑sqlnet.ora文件中是否有NAMES.D ...

  9. LeetCode 538. Convert BST to Greater Tree (把二叉搜索树转换成较大树)

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  10. CentOS6编译LAMP基于FPM模式的应用wordpress

    CentOS6编译LAMP基于FPM模式的应用wordpress 引言:其实我们可以直接使用yum安装LAMP(Linux+Apache[httpd]+Mysql+PHP),比手动编译安装LAMP要简 ...