1. 概述

  ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码。

2. 使用 IApplicationBuilder 创建中间件管道

2.1 匿名函数

  使用Run, Map, Use ,MapWhen等扩展方法来实现。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}

  第一个Run委托终止了管道。

  用 Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不 调用 next 参数使管道短路。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
context.Response.ContentType = "text/plain;charset=utf-8"; await context.Response.WriteAsync("进入第一个委托 执行下一个委托之前\r\n"); // 调用管道中的下一个委托
await next.Invoke(); await context.Response.WriteAsync("结束第一个委托 执行下一个委托之后\r\n");
}); app.Run(async context =>
{
await context.Response.WriteAsync("进入第二个委托\r\n"); await context.Response.WriteAsync("Hello World!\r\n"); await context.Response.WriteAsync("结束第二个委托\r\n");
});
}

2.2 自定义中间件类

  新建中间件类:MyMiddleware.cs

using Microsoft.AspNetCore.Http;

public class MyMiddleware
{
private readonly RequestDelegate _next; // 在应用程序的生命周期中,中间件的构造函数只会被调用一次
public MyMiddleware(RequestDelegate next)
{
this._next = next;
} public async Task InvokeAsync(HttpContext context)
{
await context.Response.WriteAsync("Hello World!"); await _next(context);
}
}

  将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<MyMiddleware>();
}

  将中间件MyMiddleware改成扩展方法:

  新建扩展类MyMiddlewareExtension.cs

using Microsoft.AspNetCore.Builder;

public static class MyMiddlewareExtension
{
public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
{
// 使用UseMiddleware将自定义中间件添加到请求处理管道中
return builder.UseMiddleware<MyMiddleware>();
}
}

  将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMyMiddleware();
}

2.3 自定义中间件类传入初始参数

public class GreetingOption
{
public string At { get; set; } public string To { get; set; }
}
using Microsoft.AspNetCore.Http;

public class GreetingMiddleware
{
private readonly RequestDelegate _next;
private readonly GreetingOption _option; public GreetingMiddleware(RequestDelegate next, GreetingOption option)
{
_next = next;
_option = option;
} public async Task Invoke(HttpContext context)
{
var message = $"Good {_option.At} {_option.To}";
await context.Response.WriteAsync(message);
}
}
using Microsoft.AspNetCore.Builder;

public static class GreetingMiddlewareExtension
{
public static IApplicationBuilder UseGreetingMiddleware(this IApplicationBuilder app, GreetingOption option)
{
return app.UseMiddleware<GreetingMiddleware>(option);
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseGreetingMiddleware(new GreetingOption
{
At = "Morning",
To = "Libing"
});
}

3. IMiddleware

  IMiddleware提供了强类型约束的中间件,其默认实现是MiddlewareFactory,接口定义如下:

public interface IMiddleware
{
Task InvokeAsync(HttpContext context, RequestDelegate next);
}

  IMiddlewareFactory用于创建IMiddleware实例及对实例进行回收,接口定义:

public interface IMiddlewareFactory
{
public IMiddleware Create (Type middlewareType); public void Release (IMiddleware middleware);
}

3.1 自定义IMiddleware类型中间件

  修改MyMiddleware,实现IMiddleware接口:

using Microsoft.AspNetCore.Http;

public class MyMiddleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
await context.Response.WriteAsync("Hello World!"); await next(context);
}
}

  将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public void ConfigureServices(IServiceCollection services)
{
// 在服务容器中注册自定义中间件
services.AddSingleton<MyMiddleware>();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 使用 UseMiddleware() 把自定义中间件添加到管道中
app.UseMyMiddleware();
}

ASP.NET Core系列:中间件的更多相关文章

  1. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  2. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  3. asp.net core 系列 14 错误处理

    一.概述 本文介绍处理 ASP.NET Core 应用中常见错误的一些方法.主要是关于:开发环境异常页:非开发环境配置自定义异常处理页:配置状态代码页(没有正文响应,http状态400~599的). ...

  4. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  5. ASP.NET Core系列(二):创建第一个.Net Core 项目

    前面讲过 .NET Core简介及开发环境安装,本章会讲一讲ASP.NET Core 2.0的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zh ...

  6. ASP.NET Core系列(三):启动类Startup

    前面讲了ASP.NET Core 的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144. ...

  7. Asp.net Core 系列之--4.事务、日志及错误处理

    ChuanGoing 2019-11-17 这篇原本时想把事务处理.日志处理.错误处理.授权于鉴权一并介绍完的,授权和鉴权我想结合自定义权限来介绍,全部放到这里篇幅可能太长,因此权限部分将会在下篇来介 ...

  8. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  9. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  10. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

随机推荐

  1. 顺F速运国际版,你的密码漏点了

    - 加密情况分析 对APP的分析过程,当然首先是安装,使用,抓包啦. 同样地,登录,抓包看看. 使用账号密码登录. - 壳呢? 虽然直接解密了顺F国际版的加密数据,但还是有必要看看它的APK. 经过分 ...

  2. push和pop的区别?

    1.push是什么?(推进) push就是推,延伸为推进.这个它是汇编的一个指令,(在其它语言中也可能会见到它).意思都是差不多的,就是把一个元素放入栈中.你可以假想栈是一个放光盘的那种盒子,有底没盖 ...

  3. Android开发利器之pidcat

    介绍pidcat: pidcat 是Android届JakeWharton大神开发的一款命令行工具,堪称Android开发利器,它能方便Android程序猿捕获日志,过滤日志,定位程序问题,超级好用. ...

  4. Linux 查找目录下大于*M的文件

    1. 查找指定文件夹下等于1M的文件 find ./ -size 1M | wc -l 2. 查找指定文件夹下大于1M的文件 find ./target_path -size +1M | wc -l

  5. appium---Android app资源监控

    我们在做app测试的过程中,都会对app内存,cpu这些做一个简单的测试,今天简单的写下如何通过python监控app这些资源变化 实现原理 1.通过adb命令查看app资源内存 2.通过python ...

  6. 鲜贝7.3--python安装

    方法一:google 搜索 anaconda 进入官网下载64位最新版本 勾选加入环境变量 +默认3.7 打开cmd pip 发现已经完成安装 右键此电脑 属性 高级属性 环境变量 ’ 已经被加入 方 ...

  7. 17. 抽象建模能力&发散思维能力&综合(5)

    抽象建模能力 题一:[扑克牌顺子] LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽 ...

  8. <BackTracking> permutation 254 47 60

    254. Factor Combinations class Solution { public List<List<Integer>> getFactors(int n) { ...

  9. Codeforces Round #553 (Div. 2) C 等差数列求和 + 前缀和

    https://codeforces.com/contest/1151/problem/C 题意 有两个等差数列(1,3,5,..),(2,4,6,...),两个数列轮流取1,2,4,...,\(2^ ...

  10. 快速傅立叶变换(FFT)

    多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...