2019独角兽企业重金招聘Python工程师标准>>>

这里就直接进入主题了,关于OWIN中间件的介绍,在此不做过多阐述。以控制台为示例,向大家演示了如何使用OWIN的中间件。

首先我们需要应用的类库有:

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

以上类库,nuget引用即可。

其次,给控制台程序,添加一个应用程序启动类。

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using MiddleWareApp.Extensions;//引用扩展类
/******************************************************************************************************************* * * 说 明: 应用程序启动类(版本:Version1.0.0)* 作 者:李朝强* 日 期:2015/05/19* 修 改:* 参 考:http://my.oschina.net/lichaoqiang/* 备 注:暂无...* * * ***************************************************************************************************************/
[assembly: OwinStartup(typeof(MiddleWareApp.Startup1))]namespace MiddleWareApp
{/// <summary>/// 启动类/// </summary>public class Startup1{/// <summary>/// /// </summary>/// <param name="app"></param>public void Configuration(IAppBuilder app){//app.Use<MiddleWare.CustomMiddleWare>();--POST//app.Use(typeof(MiddleWare.CustomMiddleWare));//注册自定义中间件//app.Use(typeof(MiddleWare.StaticMiddleWare));//注册第二个中间件app.UseCustomMiddleWare(new CustomOptions(){//自定义配置信息Name = "CustomMiddleWare"});app.UseStaticMiddleWare(new StaticOptions(){});app.Run((context) =>{context.Response.ContentType = "text/plain";Console.WriteLine("来自请求:{0}", context.Request.Uri);return context.Response.WriteAsync("000");});}}
}

在控制台主程序函数中,启动WebApp。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin.Hosting;namespace MiddleWareApp
{class Program{/// <summary>/// 主程序/// </summary>/// <param name="args"></param>private static void Main(string[] args){using (WebApp.Start<Startup1>(new StartOptions("http://localhost:9966/"){})){Console.WriteLine("OWIN服务器已经启动!按任意键退出");Console.ReadLine();}}}
}

这里尝试监听,监听端口9966。需要注意的是,WebApp.Start方法,返回的是一个集成IDsipose接口的对象,我们如果要监听HTTP请求,使用using的时候,注意,它一旦释放,客户端请求将失败,道理很简单,就是不能把WebApp.Start方法启动后返回的对象给释放了,否则,一切监听和中间件将无济于事。

我这里定义了两个中间件,分别为CustomMiddleWare和StaticMidlleWare。于此同时,我为了使用中间件的选项参数,定义了一个中间件基类MiddleWareBase(抽象类)。CustomMiddleWare直接继承

Microsoft.Owin.OwinMiddleware

StaticMidlleWare则继承

MiddleWareBase<T> 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin;/******************************************************************************************************************* * * 说 明: 授权(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 18:40:20* 修 改:2017-03-26 18:40:20* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.MiddleWare
{/// <summary>/// 中间件基类/// </summary>/// <typeparam name="T"></typeparam>public abstract class MiddleWareBase<T> : Microsoft.Owin.OwinMiddleware{/// <summary>/// 设置选项/// </summary>public T Options { get; protected set; }/// <summary>/// 构造函数/// </summary>/// <param name="next"></param>protected MiddleWareBase(OwinMiddleware next): base(next){}/// <summary>/// 构造函数重载/// </summary>/// <param name="next"></param>/// <param name="options"></param>protected MiddleWareBase(OwinMiddleware next, T options): base(next){this.Options = options;}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin;
using MiddleWareApp.Extensions;/******************************************************************************************************************* * * 说 明: 授权(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 17:57:30* 修 改:2017-03-26 17:57:30* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.MiddleWare
{/// <summary>/// CustomMiddleWare/// </summary>public class CustomMiddleWare : Microsoft.Owin.OwinMiddleware{/// <summary>/// Options/// </summary>public CustomOptions Options { get; private set; }/// <summary>/// 构造/// </summary>/// <param name="next"></param>public CustomMiddleWare(OwinMiddleware next): base(next){}/// <summary>/// 构造/// </summary>/// <param name="middleware"></param>/// <param name="options"></param>public CustomMiddleWare(OwinMiddleware middleware, CustomOptions options): base(middleware){this.Options = options;}/// <summary>/// /// </summary>/// <param name="context"></param>/// <returns></returns>public override Task Invoke(Microsoft.Owin.IOwinContext context){var p = Options;context.Response.Write("<p>C<strong>ustomMiddleWare</strong>!This is an middleware!</p>");return Next.Invoke(context);//传递下一个中间件}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin;
using MiddleWareApp.Extensions;/******************************************************************************************************************* * * 说 明: 授权(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 18:16:06* 修 改:2017-03-26 18:16:06* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.MiddleWare
{/// <summary>/// 我们定义的第二个中间件/// </summary>public class StaticMiddleWare : MiddleWareBase<StaticOptions>{/// <summary>/// 构造函数/// </summary>/// <param name="next"></param>/// <param name="options"></param>public StaticMiddleWare(OwinMiddleware next, StaticOptions options): base(next, options){}/// <summary>/// Invoke/// </summary>/// <param name="context"></param>/// <returns></returns>public override Task Invoke(IOwinContext context){context.Response.Write("<p><strong>StaticMiddleWare</strong>!This is a middleware.</p>");return Next.Invoke(context);//交给下一个中间件处理}}
}

为中间件,定义选项参数,扩展给IAppBuilder类型方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Owin;/******************************************************************************************************************* * * 说 明: 授权(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 18:23:57* 修 改:2017-03-26 18:23:57* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{/// <summary>/// <![CDATA[自定义扩展类]]>/// </summary>public static class CustomExtension{/// <summary>/// <![CDATA[使用自定义中间件]]>/// </summary>/// <param name="app"></param>/// <param name="options"></param>public static void UseCustomMiddleWare(this IAppBuilder app, CustomOptions options){app.Use(typeof(MiddleWare.CustomMiddleWare), options);//注意:Use方法是通过构造函数注入到中间件中的}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MiddleWareApp.MiddleWare;
using Owin;/******************************************************************************************************************* * * 说 明: 授权(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 18:46:32* 修 改:2017-03-26 18:46:32* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{/// <summary>/// StaticExtension/// </summary>public static class StaticExtension{/// <summary>/// UseStaticMiddleWare/// </summary>/// <param name="app"></param>/// <param name="options"></param>public static void UseStaticMiddleWare(this IAppBuilder app, StaticOptions options){app.Use<StaticMiddleWare>(options);}}
}

定义两个option对象:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;/******************************************************************************************************************* * * 说 明: 授权(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 18:25:12* 修 改:2017-03-26 18:25:12* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{/// <summary>/// 自定义中间件,设置选项/// </summary>public class CustomOptions{/// <summary>/// 名称/// </summary>public string Name { get; set; }}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;/******************************************************************************************************************* * * 说 明: StaticOptions(版本:Version1.0.0)* 作 者:李朝强* 日 期: 2017-03-26 18:46:06* 修 改:2017-03-26 18:46:06* 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com* 备 注:暂无...* * * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{/// <summary>/// StaticOptions/// </summary>public class StaticOptions{}
}

至此,关于OWIN中间件的常见用法,介绍到此,看完,有没有觉得OWIN中间件So easy!只要明白它的原理,怎么个玩法,看你的了!看代码看的手痒痒的,动手试一试吧。

更深一步的用法,不在此文中探讨!

转载于:https://my.oschina.net/lichaoqiang/blog/867927

OWIN之中间件用法示例相关推荐

  1. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法

    中间件用法--讲解 Koa2 中间件的用法及如何开发中间件 ?? iKcamp 制作团队 原创作者:大哼.阿干.三三.小虎.胖子.小哈.DDU.可木.晃晃 文案校对:李益.大力萌.Au.DDU.小溪里 ...

  2. Go基础系列:双层channel用法示例

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 双层通道的解释见Go的双层通道 ...

  3. objdump反汇编用法示例

    objdump反汇编用法示例 原文:http://blog.csdn.net/zoomdy/article/details/50563680 -d:将代码段反汇编 -S:将代码段反汇编的同时,将反汇编 ...

  4. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  5. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例

    本文实例讲述了php指定长度分割字符串str_split函数用法.分享给大家供大家参考,具体如下: 示例1:$str = 'abcdefgh'; $arr = str_split($str,2); 运 ...

  6. Linux find 用法示例

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  7. mysql教程or怎么用_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

  8. html兄弟选择器怎么用,CSS的相邻兄弟选择器用法示例讲解

    对于有相同父元素的相邻HTML元素查找便可以使用CSS的相邻兄弟选择器,这里我们就来看一下CSS的相邻兄弟选择器用法简单讲解: 可选择紧接在另一个元素后的元素,且二者有相同的父级元素 下面代码中,it ...

  9. boost::format模块format的基本用法示例

    boost::format模块format的基本用法示例 实现功能 C++实现代码 实现功能 boost::format模块format的基本用法示例 C++实现代码 #include "b ...

最新文章

  1. python pandas 遍历 DataFrame
  2. 自动化测试测试工具 AirTest 的使用方法与简介
  3. 网页怎么在图片上添加文字_想给图片添加文字,留白,添加小印章?用手机三步搞定...
  4. MySQL—异常处理
  5. linux 中卸载提示设备正忙怎么办?
  6. 学习python第十天
  7. JAVA 比较两个日期相差的天数的方法比较
  8. Java学习之向上、下转型
  9. 【extjs6学习笔记】1.9 初始: Mixins
  10. 【软件工程】 期末考试 重点复习
  11. 2.证券投资基金的概述
  12. 樱花何处有?动态樱花飘落图
  13. 使用微信wx-open-launch-app标签实现微信网页打开App记录
  14. 那个跑外业的同事开始学习考测绘师了
  15. 时间序列平稳性分析和白噪声检验
  16. python 实现单链表 Lined List
  17. 转载一位老码农的技术理想
  18. mysql_性能优化一(慢查询分析)
  19. 传奇脚本显示服务器开区时间代码,GOM引擎活动页面脚本,传奇私服服务端添加开即时真假半兽人脚本...
  20. 赛扬处理器_【推仔说新闻】英特尔发布新款奔腾、赛扬处理器

热门文章

  1. C# string转double,double转string
  2. 红蓝对抗之如何利用Shellcode来躲避安全检测
  3. mapping数据列表
  4. 在spring配置中出现的问题,解决方案
  5. 数据结构期末复习(に)--链式栈定义及使用
  6. 高级软件工程2017第2次作业—— 个人项目:四则运算题目生成程序(基于控制台)...
  7. 细数那些年我用过的前端开发工具
  8. Visio中如何绘制黑白图像
  9. HDFS分布式文件系统设计思想
  10. [译]Kinect for Windows SDK开发入门(八):骨骼追踪进阶 上