绝大部分Middleware需要预设一些属性,这些属性可以通过改造构造函数来实现:

来源:互联网 发布:c语言重定向是什么意思 编辑:程序博客网 时间:2024/05/22 20:28

(获取软件加QQ:1458910822)


上篇我们谈了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;

///
/// Middleware类必须继承Microsoft.Owin.OwinMiddleware
///


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就是我们上面所说的上下文信息.
0 0