原文:OWIN的理解和实践(三) –Middleware开发入门
上篇我们谈了Host和Server的成立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的Middleware,本篇我们就着重介绍下Middleware的开发入门.
Middleware是什么如果把HTTP交互理解为一次答题勾当,那么Request是问题,Response就是答案,Server是课堂,Middleware就是参预者,注意我这里用的是参预而不是解答,因为我们允许有些Middleware不给出答案.
Middleware有什么资源要参预答题勾当就必需有常识,也就是资源.在OWIN法则中,所有Middleware只能获得并影响一个资源,这个就是OWIN Context,有一个Microsoft.Owin. IOwinContext接口界说了这个上下文的标准. 我们来看下这个里面有什么对象.
这个上下文接口中 供给的资源,是Middleware进行运作的关键:
Authentication : 获取可在当前请求上使用的身份验证(Identity)中间件成果。通过这个属性可以非常便捷在任何Middleware中访谒当前的Identity信息.固然至少一个Identity中间件需要被加载,否则这个属性中的内容没有意义.
Environment: 获取已包装的 OWIN 环境。它素质是一个数据字典,一个Middleware操作Key放入一个信息,而此外一个Middleware按照Key拿出来使用. 和Session异曲同工.
Request: 获取可果然特定于请求的属性的包装。Middleware从这里了解我们的提问者(Request)供给了那些信息.
Response : 获取可果然特定于响应的属性的包装。Middleware通过这个属性可以给出,影响或者转变我们的Response(答案),固然它也可以不做任何调解.
Middleware到底做什么,怎么做简单来说,Middleware可以做什么怎么做可以归结为以下几点:
获得OWIN Context和它内部封装的所有信息.
从Request中获取请求的所有信息.
从Environment中获取其他Middleware共享的资源,以便于和其他Middleware交互,或者使用其他Middleware供给的成果.
从Authentication中获取当前的身份验证信息和功效.
通过Response给出,影响,甚至转变Server即将发出的”答案”
Middleware有哪几种类型刚刚我们说了,Middleware不必然是问题的解答者, 他们有前后的挨次和各自回答问题的方法,按照他们的参预方法,我把他们分成3种情况:
解答者: 了解问题的内容(Request),给出最终答案(Response),一般不需要后续解答者的参预. 对照范例是解答者是WebApi和StaticFiles(静态文件).
参预者: 了解问题的内容,给出必然的资源(Environment)供其他参预者使用,自己一般不参预解答, 有可能在答案中插手一些附加信息.对照范例的有Session和Identity.它们一般会插手一些Cookie但不影响Response实体内容.
监控者: 在其他参预者开始措置惩罚惩罚或者措置惩罚惩罚完毕的时候对当前的Context中的信息进行措置惩罚惩罚,它也一般不参预解答,有可能在答案中插手一些附加信息. 对照范例的有Logging, Diagnostics.
如何创建Middleware创建一个的Middleware分以下几个法式:
引入Microsoft.Owin包
成立一个类
使这个类担任Microsoft.Owin.OwinMiddleware
实现这个类的结构函数
笼罩并实现父类的Invoke函数
一个最为范例的实现如下
using Microsoft.Owin; using System.Threading.Tasks; /// <summary> /// Middleware类必需担任Microsoft.Owin.OwinMiddleware /// </summary> public class SampleMiddleware : OwinMiddleware { public SampleMiddleware(OwinMiddleware next) : base(next) { //结构函数 } public override Task Invoke(IOwinContext context) { //中间件的实现代码 return Next.Invoke(context); } }
绝大部分Middleware需要预设一些属性,这些属性可以通过改革结构函数来实现:
object m_Options; public SampleMiddleware(OwinMiddleware next,object options) : base(next) { //引入参数类,并可以再类中使用 m_Options = options; }
固然类似的options参数可以有多个.
以上的Middleware实现其实是没有意义的,因为没有做任何工作,下面我将给出一个”给出答案”的简单实现,按照上面的描述,我不才面仅仅给出Invoke函数的内容.
这里再插一句,上述代码中的next或Next指的是排在这个Middleware之后的另一个Middleware,而context就是我们上面所说的上下文信息.
一个简单的Middleware典型