中间件官网文档解释:中间件是一种装配到应用管道以处理请求和响应的软件 每个中间件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作。

使用 IApplicationBuilder 创建中间件管道

ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

IApplicationBuilder提供了三个扩展方法配置请求委托

  • app.Run 作用添加一个终端中间件,因为不在向下传递请求,常常公开在管道末尾运行。实例代码
  app.Run(async context =>
{
await context.Response.WriteAsync("Hello, middleware!");
});
  • app.Use 将多个请求委托链接在一起。next 参数表示管道中的下一个委托。 可通过不 调用 next 参数使管道短路等同于aap.run。 通常可在下一个委托前后执行操作,如以下示例所示:
  app.Use(async (context, next) =>
{
// 传递前操作
await next.Invoke();
// 传递前操作
}); app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
}
  • Map 扩展用作约定来创建管道分支。 Map 基于给定请求路径的匹配项来创建请求管道分支。 如果请求路径以给定路径开头,则执行分支。实例代码如下
  private static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
} private static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
} public void Configure(IApplicationBuilder app)
{
app.Map("/map1", HandleMapTest1); app.Map("/map2", HandleMapTest2); app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
});
}

自定义中间件

以下演示记录api输入输出参数的中间件。

1.创建一个webapi项目,在默认的WeatherForecastController控制器中添加一个简单的post方法,代码如下

 [HttpPost]
public string PostWeatherForecast([FromBody]WeatherForecastA weatherForecastA)
{
return "添加成功";
}
public class WeatherForecastA
{
public int TemperatureC { get; set; }
}

2.新建一个中间件类.CS文件如图

选择之后默认代码如下:

 // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class LogReqResponseMiddleware
{
private readonly RequestDelegate _next; public LogReqResponseMiddleware(RequestDelegate next)
{
_next = next;
} public Task Invoke(HttpContext httpContext)
{ return _next(httpContext);
}
} // Extension method used to add the middleware to the HTTP request pipeline.
public static class LogReqResponseMiddlewareExtensions
{
public static IApplicationBuilder UseLogReqResponseMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<LogReqResponseMiddleware>();
}
}

脚手架自动帮我们创建一个 Invoke方法,传递给下一个中间件。一个将自定义的中间件添加到了http请求管道的扩展方法UseLogReqResponseMiddleware。

上面invoke不是异步的,我们自己可以改动,以下代码展示 一个api请求的输入参数和输出信息的日志打印

 // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class LogReqResponseMiddleware
{
private readonly RequestDelegate _next; public LogReqResponseMiddleware(RequestDelegate next)
{
_next = next;
} public async Task Invoke(HttpContext httpContext, ILogger<LogReqResponseMiddleware> logger)
{
var request = httpContext.Request;
    request.EnableBuffering();
//把请求body流转换成字符串
 string bodyAsText = await new StreamReader(request.Body).ReadToEndAsync();//记录请求信息
var requestStr = $"{request.Scheme} {request.Host}{request.Path} {request.QueryString} {bodyAsText}";
logger.LogDebug("Request:" + requestStr);
request.Body.Seek(0, SeekOrigin.Begin); var originalBodyStream = httpContext.Response.Body;
using (var responseBody = new MemoryStream())
{
httpContext.Response.Body = responseBody;
await _next(httpContext); var response = httpContext.Response;
response.Body.Seek(, SeekOrigin.Begin);
//转化为字符串
string text = await new StreamReader(response.Body).ReadToEndAsync();
//从新设置偏移量0
response.Body.Seek(, SeekOrigin.Begin); //记录返回值
var responsestr = $"{response.StatusCode}: {text}";
logger.LogDebug("Response:" + responsestr); await responseBody.CopyToAsync(originalBodyStream);
}
} }
// Extension method used to add the middleware to the HTTP request pipeline.
public static class LogReqResponseMiddlewareExtensions
{
public static IApplicationBuilder UseLogReqResponseMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<LogReqResponseMiddleware>();
}
}

然后在Startup类的Configure方法中添加下面一行代码,把自定义的中间添加到了HTTP请求的管道中。

app.UseLogReqResponseMiddleware();//记录http请求 输入、输出值;

我们在postman中模拟请求

控制台上打印的信息如下:

.NET Core 3.0 中间件 Middleware的更多相关文章

  1. [译]ASP.NET Core 2.0 中间件

    问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public vo ...

  2. .NET Core 3.0 部署在docker上运行

    自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...

  3. [译]ASP.NET Core 2.0 系列文章目录

    基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...

  4. [ASP.NET Core 2.0 前方速报]Core 2.0.3 已经支持引用第三方程序集了

    发现问题 在将 FineUIMvc(支持ASP.NET MVC 5.2.3)升级到 ASP.NET Core 2.0 的过程中,我们发现一个奇怪的现象: 通过项目引用 FineUICore 工程一切正 ...

  5. ASP.NET Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...

  6. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

  7. Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...

  8. 如何传递参数给ASP.NET Core的中间件(Middleware)

    问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...

  9. ASP.NET Core -中间件(Middleware)使用

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

随机推荐

  1. 前端 NPM常用命令行

    1. 登陆npm npm login 2. 将项目发布至npm npm publish 3. 查看已有源; 其中前面带星号的为当前使用的npm源 nrm ls 4. 切换源 nrm use 或 如: ...

  2. 12-DOM相关案例

    12-关于DOM操作的相关案例   1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCT ...

  3. 3D虚拟环境中的选择技术分类

    我们在3D虚拟环境(Virtual Environment, VE)中需要完成的操作有3种:选择物体,操纵(改变)物体,移位(locomotion).这里来总结一下3D VE中的选择技术的种类.本文根 ...

  4. css 精灵图的使用

    精灵图的使用 1.给一个容器定义一个大小(宽高) 2.引入背景图 3.定位到自己你想要的图片位置 例如:  background-position: 0 0;  background-position ...

  5. 自动下载zar配置管理

    maven 下载: https://maven.apache.org/ 官网 download 下载:Binary zip archive apache-maven-3.6.2-bin.zip 免安装 ...

  6. 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解

    一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...

  7. mysql 分页offset过大性能问题解决思路

    在公司干活一般使用sqlserver数据库.rownumber分页贼好用. 但是晚上下班搞自己的事情就不用sqlserver了.原因就是自己的渣渣1核2g的小服务器完全扛不住sqlserver那么大的 ...

  8. 直通BAT面试题库锦集

    01 python面试题(汇总) 02 面向对象 03 网络和并发编程 04 模块 05 设计模式 06 前端 07 Django框架 08 Flask 09 tornado 10 DB

  9. 基于OAuth 2.0的第三方认证 -戈多编程

    引用(http://www.cnblogs.com/artech/p/oauth-01.html) OAuth 2.0的角色 获得资源拥有者授权的第三方应用请求受保护的资源采用的不是授权者的凭证,所有 ...

  10. SQL SERVER数据库三种数据插入方式

    数据插入:INSERT INTO A(CBM,CMC) VALUES('1','测试')--单条数据插入INSERT INTO A(CBM,CMC)SELECT '1','测试'--单条数据插入INS ...