回到目录

在进行.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跨平台~聊聊中间件的更多相关文章

  1. DotNetCore跨平台~文章索引~永久更新

    本索引目录主要包括仓储大叔对dotnet core架构的研究与知识积累,从2016年开始进行撰写,到今天已经有一年多了,其中有一些小知识,小技巧,小应用,希望给大家在开发时一些启发,也希望dotnet ...

  2. DotNetCore跨平台~Quartz定时单次任务

    之前写过一篇文件<DotNetCore跨平台~Quartz热部署的福音-监控文件夹的变化>,今天主要把框架优化了一下,支持外部触发,并支持外部将参数以JobDataMap形式进行输入,然后 ...

  3. DotNetCore跨平台~Dapper的使用

    回到目录 Dapper作为小型ORM的代表作品被我们应用到了dotnet core的项目中,下面将把自己在项目中使用dapper进行curd操作的过程写一下,后期可能会遇到一些问题,大叔也会在这个系列 ...

  4. [转帖]DotNetCore跨平台~System.DrawingCore部署Linux需要注意的

    DotNetCore跨平台~System.DrawingCore部署Linux需要注意的   https://www.bbsmax.com/A/QV5ZemYVJy/?tdsourcetag=s_pc ...

  5. DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection

    写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac, ...

  6. DotNetCore跨平台~Startup类的介绍

    新宠儿 DotNetCore是.net5.0版本,之所以不叫.net5.0为的就是不让我们把它与前面的.net混为一淡,它将是真正意义的跨平台开发语言,在网上也有相关介绍,中国的一些大牛也发了相关文章 ...

  7. 跨平台通信中间件thrift学习【Java版本】(转)

    转自:http://neoremind.com/2012/03/%E8%B7%A8%E5%B9%B3%E5%8F%B0%E9%80%9A%E4%BF%A1%E4%B8%AD%E9%97%B4%E4%B ...

  8. DotNetCore跨平台~性能测试~可以放心使用了

    使用dotnetCore发布站点后,它的处理请求能力不逊色IIS等大型服务的能力,号称每秒能处理115万个请求,太牛X了也. 先看看它支持的数据库 以下主流数据库都是为支持的 Microsoft SQ ...

  9. DotNetCore跨平台~服务总线_事件总线的重新设计

    理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的, ...

随机推荐

  1. HTTP 常见状态码解析

    1XX 表示消息 2XX 表示成功 3XX 表示重定向 4XX 表示请求错误 5XX 表示服务器端错误 消息:请求已被接受,需要继续处理.由于 HTTP/1.0 协议中没有定义任何 1xx 状态码. ...

  2. BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈

    BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...

  3. Loadrunner下载脚本

    由于最近又在SGM做性能测试,扒拉出一篇去年5.6月份的一个脚本. 最近写的翻来看看其实也蛮简单的,还是就不放博客了. Action(){ //定义文件大小 int flen; //定义响应数据内容大 ...

  4. jdbc 增删改查以及遇见的 数据库报错Can't get hostname for your address如何解决

    最近开始复习以前学过的JDBC今天肝了一晚上 来睡睡回笼觉,长话短说 我们现在开始. 我们先写一个获取数据库连接的jdbc封装类 以后可以用 如果不是maven环境的话在src文件下新建一个db.pr ...

  5. linux 挂载共享文件夹

    1.背景 通常会有这样的场景,开发人员在Windows编写代码,然后放在linux环境编译,我们通过mount命令就可以实现将代码直接挂到linux环境上去,使Windows上的共享文件夹就像linu ...

  6. SprintBoot的@ComponentScan“踩坑”

    主要的话说在前面:在启动日志中没有看到Controller对应的URL被映射,那么请检查你的Controller是否被Spring管理了.此次踩坑就是忘了SpringBoot在没配置@Componen ...

  7. 性能测试入门 — LoadRunner 使用初探

    前言: 性能测试是利用产品.人员和流程来降低应用程序.升级程序或补丁程序部署风险的一种手段.性能测试的主要思想是通过模拟产生真实业务的压力对被测系统进行加压,验证被测系统在不同压力情况下的表现,找出其 ...

  8. 浅谈java线程池实现

    再进入主题之前,我们先了解几个概念,对读源码有所帮助,对于线程池的运行状态,有4个级别,分别是RUNNING,SHUTING,STOP,TIDING,TERMINATED 解释如下: The runS ...

  9. 使用StackExchange.Redis 连接redis的pipeline命令使用

    这几天公司老项目用到了这个组件,需要设置初始化ID,发现这个组件没有pipeline命令的方法,去官方文档去瞅了一波,发现也没有给出对应的解决方案,后面自己发现组件里面其实有 其实就是这个接口的一个方 ...

  10. 理解Device Tree Usage(续)

    4 How Interrupts work   与遵循树的自然结构的地址范围转换不同, 中断信号可以起源于或者终止于板卡上的任何设备. 与设备树中自然表示的设备寻址不同,中断信号的表示独立于设备树节点 ...