上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中。这一章,我们将对框架与OwinHost之间怎么通过OWIN协议作出解析。

本章我们将讨论学习:

  (1)、连接两世界之门——“Middleware“

  (2)、转动大门的钥匙,打开无尽的财宝

  (3)、适配器?转换插头

相关示例代码,可以点击这里进行下载。


1、充当”门“的”Middleware“

英文名”Middleware“,中文名”中间件“,要了解什么是Middleware,我们先看看OWIN协议中的分层。

Linux.NET学习手记(8)

上图为OWIN分层的一个简图。最下的一层是我们的操作系统,Linux、Windows、Unix、Mac或其他;对上一层则是运行于操作系统中的OwinHost;再往上一层也就是紫色那层是基于OWIN协议建立的基础框架;而最顶层则是我们基于这些OWIN协议的框架所诞生的应用程序(直接操作OWIN字典的暂不记录在图中)。

抛开最顶和最底两层不管,当用户从客户端发起一请求,经过漫长的网络,到达目标主机时,请求将被并且仅能被OwinHost捕获,因为只有OwinHost在持续的不断监听端口。虽然请求已经被OwinHost捕获,但是OwinHost并没有能力对这个刚捕获的请求做出处理(这里特指需要经过OWIN框架及相关应用程序处理的请求)即使它知道自身有请求需要处理。

同样的,我们再把目光转到OWIN框架,它是我们的”处理中枢“,它能够对我们把我们的输入通过适当的计算之后把正确的答案输出来,但是它也有一个缺点,那就是它自身没有办法收集”相关信息“,也就是它自己并不能产生出”输入“。

这就好比人的大脑与其他器官,OWIN框架是我们的”大脑“,OwinHost则是我们的”器官“,没有了大脑我们的其他器官也无法正常运行(当然咯,有点功能不需要大脑,就像有些OwinHost处理静态资源不需要经过OWIN框架一样),没有了其他“器官”的支持“大脑”也无法发挥作用甚至会死亡(没有宿主,OWIN框架也无法运行)。

Linux.NET学习手记(8)

因此,我们需要有相应的“神经”来连通我们的“器官”与“大脑”之间的通信。而Middleware发挥的就是这种作用,它是连接OwinHost与OWIN框架的门,OwinHost把捕获到的请求通过自身的处理后通过这扇门推送到OWIN框架中;而OWIN框架也自己对请求计算后得出的响应通过这扇门返回到OwinHost中,再由OwinHost推送到用户手上。

而事实上,Middleware作为一扇连接OwinHost与OWIN框架的门,让这两个世界得以交流以外,还发挥着另外一个作用,那就是规定了统一的信息出入口,所有的请求响应均只能够通过这扇门传递,这或者可以更方便的对一些敏感信息、恶意代码之流的数据进行拦截与过滤。

 

2、转动我们手中的钥匙

正如上一节中最后所讲到的一样,Middleware作为OWIN框架与OwinHost的唯一通道,这意味着无论是SignalR、NancyFX、Webapi、FubuMVC或是其他,它们所站立的起点高度都是一致的,我们只要把能握住Middleware,就相当于把握住了大门的钥匙,我们也可以做出我们自己的框架出来。这也是我在上一回合中所提到OWIN协议给我们带来的好处中的第二点:“它给鼓励了一批人把自己的想法变成现实”。

本节我们将简述如何直接操作OWIN字典,直接和OwinHost进行通信。

首先我们需要在Visual Studio中建立我们的项目,然后通过NuGet获得OWIN:

Linux.NET学习手记(8)

然后我们新建一个类,并以它作为我们的Middleware:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace Demo1
{
    using AppFun = Func<IDictionary<string, object>, Task>;
    public class MyMiddleware
    {
        private readonly AppFun _env;

        public MyMiddleware(AppFun env)
        {
            if (env == null) throw new ArgumentNullException("OWIN环境参数为空");
            this._env = env;
        }

        public Task Invoke(IDictionary<string, object> env)
        {
            var responseBody = "Linux.NET 学习手记(8)&nbsp;        --小蝶惊鸿";
            var responseBodyBytes = Encoding.UTF8.GetBytes(responseBody);
            ((IDictionary<string, string[]>)env["owin.ResponseHeaders"]).Add("Content-Type", new string[] { "text/html; charset=utf-8" });
            ((Stream)env["owin.ResponseBody"]).Write(responseBodyBytes, 0, responseBodyBytes.Length);
            return this._env(env);
        }
    }
}
MyMiddleware

相关文章:

  • 2021-11-23
  • 2021-10-12
  • 2021-09-07
  • 2021-06-27
  • 2021-10-15
  • 2021-09-10
猜你喜欢
  • 2021-11-20
  • 2021-08-17
  • 2021-07-20
  • 2022-01-06
  • 2021-12-07
  • 2021-09-19
  • 2021-09-16
相关资源
相似解决方案