OWIN katana注册中间件的几种写法
首先特别说明下在startup中注册完中间件的两个注意事项,看到有人写的东西有误导人的作用。关于startup启动发现类的内容,参照这里 http://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection
1. 使用IApplicationBuilder.User注册中间件是有先后顺序关系的。
2. 注册的中间件的执行过程是这样的:输入初始化是按照顺序来的,输出执行是反顺序来的。
请求发生-->初始化中间件--->初始化中间件n-->app忽略中间件方法,直接响应输出--------->中间件n Invoke执行处理-->中间件 Invoke执行处理--->响应输出
进入正文
OWIN middleware 必须是具有以下代码特征,要么是直接在startup类中直接注册,要么就是写的中间件类中方法返回。
Func<IDictionary<string, object>, Task> //这个function具有一个上下文的字典参数(OWIN environment dictionary),并返回Task
这段特征码中的IDictionary<string, object>其实已经被katana的server层包装成字典形式的请求上下文(HttpContext)IOwinContext,可以使用上下文属性environment访问字典值
我们会以这种形式注册中间件
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware); //middleware 可以是委托 or 类型 or 实例
中间件注册进入管道,由于中间件返回一个Task,就能保证管道在处理的时候能找到下一个执行的Task(就是下边代码中的next参数,那么next就是已知的第一个RequestDelegate参数)来处理请求和响应。Task就是返回的具有中间件特征的中间件。
下面我们看下第一种写法
app.Use(new Func<RequestDelegate, RequestDelegate>(next => (async context =>
{
Console.WriteLine("初始化组件开始");
await next.Invoke(context);
Console.WriteLine("管道下步执行完毕");
})));
以上代码中会在请求时在控制台输出“初始化组件开始”,当组件的下一个步骤执行完毕后,会再打印出“管道下步执行完毕”。
有时候组件里没啥规则,但是也必须接受next作为参数,但是可以忽略它,并且仍然需要返回一个task,所以可以这样写
app.Use(new Func<RequestDelegate, RequestDelegate>(ignoreNext => (content=>
{
Console.WriteLine("The request ends with me!");
return Task.FromResult();
})));
第二种写法是将已有的方法传递给委托。如果你有一些逻辑需要抽象出来,但又不想单独写一个中间件类,这个写法就比较合适
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(new Func<RequestDelegate, RequestDelegate>(next => content=> Invoke(next, content)));
} private async Task Invoke(RequestDelegate next, IDictionary<string, object> environment)
{
Console.WriteLine("初始化组件开始");
await next.Invoke(environment);
Console.WriteLine("管道下步执行完毕");
}
}
如果使用一下代码注册组件,那么久必须写一个实际的中间件类了
app.Use(typeof(LoggingMiddleware));
或者以中间件实例来注册
app.Use(new LoggingMiddleware());
第三种写法是实现一个实际的中间件类
public class LoggingMiddleware
{
private RequestDelegate next; public LoggingMiddleware(RequestDelegate next)
{
this.next = next;
} public async Task Invoke(IDictionary<string, object> environment)
{
Console.WriteLine("初始化组件开始");
await next.Invoke(environment);
Console.WriteLine("管道执行完毕");
}
}
第四种写法我们可以集成Microsoft.Owin库中的OwinMiddleware基类来实现中间件类。它提供了强类型访问IOwincontext。
public class LoggingMiddleware : OwinMiddleware
{
public LoggerMiddleware(OwinMiddleware next)
: base(next)
{
} public async override Task Invoke(IOwinContext context)
{
Console.WriteLine("初始化组件开始");
await Next.Invoke(context);
Console.WriteLine("管道执行完毕");
}
}
以上几种写法实现都干了一样的事情,其实更多复杂的中间件定义可以参考下Microsoft.AspNet.Diagnostics下的几种中间件实现方式,比入WelcomePageMiddleware.cs,就是我们在app中使用UserWelcomPage()方法注册的中间件。
OWIN katana注册中间件的几种写法的更多相关文章
- JNI的第2种写法:本地方法注册
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 孔乙己说,茴香豆的茴有四种写法,今天谈谈JNI的第2种写法:本地方法注册. 这种写法的好处是不需要使用ja ...
- Owin Katana 的底层源码分析
最近看了一下开源项目asp.net katana,感觉公开的接口非常的简洁优雅,channel 9 说是受到node.js的启发设计的,Katana是一个比较老的项目,现在已经整合到asp.net c ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java单例模式的几种写法比较
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、短信发送器、Android 中各种布局(1)
1.Android是什么 手机设备的软件栈,包括一个完整的操作系统.中间件.关键的应用程序,底层是linux内核,安全管理.内存管理.进程管理.电源管理.硬件驱动 2.Dalvik VM 和 JVM ...
- Android开发系列之按钮事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity ...
- 用UseMiddleware扩展方法注册中间件类
用UseMiddleware扩展方法注册中间件类 .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件 ...
- Android按钮事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity ...
随机推荐
- 2015-4-2的阿里巴巴笔试题:乱序的序列保序输出(bit数组实现hash)
分布式系统中的RPC请求经常出现乱序的情况.写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:123, ...
- PHP - PDO 之 mysql 参数绑定
<?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...
- PostgreSQL+PostGIS的使用 函数清单
一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...
- SQL学习中(序)
从校园中走出来已经两年多了,从最初的企业建站到现在的BPM流程开发,深深的感觉到自己底子很差,因此在园子里记录一下学过的知识,以此自勉. 废话到此结束,今天就先来看一下CREATE CHEMA 语句. ...
- 在DataTable中执行DataTable.Select("条件")
.在DataTable中执行DataTable.Select("条件")返回DataTable: // <summary> // 执行DataTable中的查询返回 ...
- TWaver3D入门探索——3D拓扑图之人在江湖
俗话说,有人的地方就有江湖,江湖就是帮派林立错综复杂的关系网.今天我们就来展示这样一个小小的江湖. 故事背景 崇祯末年,民不聊生,烽烟四起-- 江湖都是有背景的,我们的3D江湖也需要一个背景.江湖就是 ...
- [搜片神器]DHT后台管理程序数据库流程设计优化学习交流
谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器: sosobt.com 大家可以给提点意见... 服务器在抓取和处理同时进行,所以访问速度慢是有些的,特别是搜索速度通过SQL的like来查 ...
- Cookie Session Cache
二. 工作机制 Ø Cookie :采用的是客户端保存信息的方案. Ø Session :采用服务器端保存信息的方案. Ø Cache :利用缓存 SRAM 来"静态"的保存写入信 ...
- 团体程序设计天梯赛-练习集L1-020. 帅到没朋友
L1-020. 帅到没朋友 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为 ...
- spoj 39
DP 完全背包问题 的 d[i] = min(d[i], d[i-w]+p) d[i]表示当总重量为i时可装的最小价值 #include <cstdio> #include &l ...