DotNetCore跨平台~聊聊中间件

简介:

在进行.net core平台之后,我们如果希望在请求过程中添加一些事件是非常容易的,你可以把这些事件做成一个中间件Middleware,然后这些中间件就会以Http pipeline的管道方式进行相应,并且它们就像是一个职责链,从你定义的第一个中间件开始,一个一个向下传递,直到最后一个中间件完成为止!

前几天我写了在.net core里实现模块化服务,DotNetCore跨平台~组件化时代来了 主要是将我们定义的组件添加到IServiceCollection集合里,然后在程序启动后去注册它们,而今天要说的Middleware用到的是IApplicationBuilder,它在程序启动后,加载与http请求相关的组件,这些组件以Pipeline的形式进行处理,也就是我们所说的中间件,下面我来带大家实现一个最简单的Middleware!

从网上找的图,挺形象

图中记录了一个请求进来,经过各个中间件的处理,最后逐个响应,下面我们来看一下简单的代码实现,和服务组件化一样,也是一个实现,一个扩展方法的调用,最后在startup里去使用它。

大叔Lind.DotNetCore框架里的Middleware

ResponseTimeMiddleware的实现

    /// <summary>
    /// 响应时间的中间件
    /// </summary>
    public class ResponseTimeMiddleware
    {
        private readonly RequestDelegate _next;
        public ResponseTimeMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine("ResponseTimeMiddleware...");
            await _next.Invoke(context);
            sw.Stop();
            Console.WriteLine($"页面响应时间为:{sw.ElapsedMilliseconds}ms");
        }

    }

扩展方法去封装它,以便于其它地方去使用它

    /// <summary>
    /// Lind.DotNetCore.Middleware扩展方法
    /// </summary>
    public static class MiddlewareExtensions
    {
        public static IApplicationBuilder UseResponseTime(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<ResponseTimeMiddleware>();
        }

        public static IApplicationBuilder UseRequestKey(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestKeyMiddleware>();
        }

        public static IApplicationBuilder UseAuthorizationOperation(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<AuthorizationOperationMiddleware>();
        }

    }

最后在startup里使用它,注意是在AddMvc方法前面,要不然对你的mvc,api是无效的,呵呵!

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseAuthorizationOperation();
            app.UseResponseTime();
            app.UseRequestKey();
            app.UseStaticHttpContext();
            app.UseMvc();

事实上,今天的中间件是.net core里非常大的亮点,其实早就应该写这篇文章了,呵呵!

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:DotNetCore跨平台~聊聊中间件,如需转载请自行联系原博主。

目录
相关文章
|
计算机视觉 索引
OpenCV(三十五):凸包检测
OpenCV(三十五):凸包检测
380 0
|
存储 Cloud Native 关系型数据库
Ganos实时热力聚合查询能力解析与最佳实践
Ganos是由阿里云数据库产品事业部与飞天实验室共同研发的新一代云原生位置智能引擎,集成于PolarDB-PG、Lindorm、AnalyticDB-PG和RDS-PG等核心产品中。Ganos拥有十大核心引擎,涵盖几何、栅格、轨迹等多种数据处理能力,实现了多模多态数据的一体化存储、查询与分析。本文重点介绍了Ganos的热力瓦片(HMT)技术,通过实时热力聚合查询与动态输出热力瓦片,无需预处理即可实现大规模数据秒级聚合与渲染,适用于交通、城市管理、共享出行等多个领域。HMT相比传统网格聚合技术具有高效、易用的优势,并已在多个真实场景中验证其卓越性能。
393 0
|
存储 关系型数据库 MySQL
MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?
一篇短文让你明白MySQL数据库的表中 NULL 和 空值之间的区别!
5371 0
MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之全量和增量同步数据的一致性、不丢失和不重复读取可以通过什么方式保证
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
|
Linux
Linux——服务器时间不同步
Linux——服务器时间不同步
242 0
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
298 2
|
Docker 容器
FunASR离线文件转写软件包3.0问题之Docker容器启动如何解决
FunASR离线文件转写软件包3.0问题之Docker容器启动如何解决
1219 0
|
Java Maven
【SpringBoot专题_02】springboot集成Swagger详细教程
【SpringBoot专题_02】springboot集成Swagger详细教程
207 0
|
数据采集 传感器 监控
高考后的职业规划:学习LabVIEW开发前景广阔
高考后的职业规划:学习LabVIEW开发前景广阔
444 0

热门文章

最新文章