本文翻译自:http://www.tutorialsteacher.com/core/aspnet-core-middleware

基本概念

ASP.NET Core引入了中间件的概念,中间件是在ASP.NET Core应用的每次请求时执行的部分。在经典的ASP.NET 中,HttpHandlers和HttpModules时请求管道的一部分。中间件和HttpHandlers和HttpModules相似,都需要在每次的请求中配置和执行。

通常,在ASP.NET Core应用中会存在很多的中间件,可以使框架提供的中间件,通过NuGet添加或者自定义的中间件。可以设置在每次请求管道中中间件的执行顺序,每一个中间件都可以添加或者修改http请求并且选择是否传递控制权限。

下图说明中间件的执行过程:

中间件创建请求的管道,下图说明ASP.NET Core请求的处理过程。

配置中间件

中间件可以在Startup的Configure方法中使用 IApplicationBuilder的实例进行配置。下面的例子中,使用Run方法添加了一个中间件,作用是在每次请求中返回“Hello World”字符串。

 public class Startup
{
public Startup()
{
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//configure middleware using IApplicationBuilder here.. app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!"); }); // other code removed for clarity..
}
}

在上面的例子中,Run()是 IApplicationBuilder实例的扩展方法,在应用请求的管道上添加了中间件。上面配置的中间件在每次请求返回了一个字符串“Hello World”。

解析Run方法

这里使用扩展方法Run添加中间件,下面是Run方法的签名:

public static void Run(this IApplicationBuilder app, RequestDelegate handler)

Run是IApplicationBuilder中的一个扩展方法,可以接受参数RequestDelegate。RequestDelegate是处理请求的委托方法,下面是RequestDelegate的签名:

public delegate Task RequestDelegate(HttpContext context);

如上所示,Run方法可以接收一个方法作为参数,这个接收的方法签名应该和RequestDelegate一致。因此,方法可以接收HttpContext参数然后返回Task。

在Run方法中可以指定Lambda表达式或者一个函数,Lambda可以和下面的实例类似:

 public class Startup
{
public Startup()
{
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(MyMiddleware);
} private Task MyMiddleware(HttpContext context)
{
return context.Response.WriteAsync("Hello World! ");
}
}

上面的MyMiddleware方法不是异步的,在执行完成前会导致线程阻塞。可以使用 async和await改为异步执行进而提高性能和扩展性。

 // other code removed for clarity

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(MyMiddleware);
} private async Task MyMiddleware(HttpContext context)
{
await context.Response.WriteAsync("Hello World! ");
}

上面的例子与下面的代理是一样的

 app.Run(async context => await context.Response.WriteAsync("Hello World!") );

 //or 

 app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});

通过这种方式,我们可以在 Run方法中配置中间件。

配置多个中间件

通常在ASP.NET Core应用中会存在多个中间件,中间件顺序执行。Run方法添加了一个terminal中间件因为无法继续调用其他中间件。下面的代码会一直执行Run方法并且永远都不会执行第二个Run方法。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World From 1st Middleware");
}); // the following will never be executed
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World From 2nd Middleware");
});
}

想要配置多个中间件,使用Use扩展方法。它和Run方法相似,区别在于它包含了下一个参数用于顺序的调用下一个中间件。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello World From 1st Middleware!"); await next();
}); app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World From 2nd Middleware");
});
}

上面的代码会在浏览器中显示

Hello World From 1st Middleware!Hello World From 2nd Middleware!

因此,我们可以使用Use()方法按照我们需要的顺序配置多个中间件。

使用NuGet添加内置的中间件

ASP.NET Core是一个模块化的框架,可以通过Nuget在程序中添加服务端的功能。在我们的程序中有很多插件化可用的中间件。

下面使内置的中间件:

Middleware Description
Authentication Adds authentication support.
CORS Configures Cross-Origin Resource Sharing.
Routing Adds routing capabilities for MVC or web form
Session Adds support for user session.
StaticFiles Adds support for serving static files and directory browsing.
Diagnostics Adds support for reporting and handling exceptions and errors.

诊断中间件

诊断功能的中间件用于报告并处理ASP.NET Core中的异常和错误,诊断EF Core的迁移错误。

在程序中添加 Microsoft.AspNetCore.Diagnostics 包,该包包含以下中间件和服务:

Middleware Extension Method Description
DeveloperExceptionPageMiddleware UseDeveloperExceptionPage() Captures synchronous and asynchronous exceptions from the pipeline and generates HTML error responses.
ExceptionHandlerMiddleware UseExceptionHandler() Catch exceptions, log them and re-execute in an alternate pipeline.
StatusCodePagesMiddleware UseStatusCodePages() Check for responses with status codes between 400 and 599.
WelcomePageMiddleware UseWelcomePage() Display Welcome page for the root path.

可以在Startup类中的Configure方法中,调用 Use* 扩展方法去使用上面的中间件。

添加WelcomePage中间件,在根目录显示Welcome信息。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseWelcomePage();
//other code removed for clarity
}

这里调用不同的 Use* 扩展方法去引入不同的中间件

ASP.NET Core之中间件的更多相关文章

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

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

  2. asp.net core mvc 中间件之WebpackDevMiddleware

    asp.net core mvc 中间件之WebpackDevMiddleware WebpackDevMiddleware中间件主要用于开发SPA应用,启用Webpack,增强网页开发体验.好吧,你 ...

  3. asp.net core mvc 中间件之路由

    asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...

  4. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...

  5. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  6. ASP.NET Core路由中间件[3]: 终结点(Endpoint)

    到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...

  7. ASP.NET Core路由中间件[2]: 路由模式

    一个Web应用本质上体现为一组终结点的集合.终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系.借助这个映射关系,客户端可 ...

  8. ASP.NET Core:中间件

    一.什么是中间件 我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中.而中间件就是用于组成应用程序管道来处理请求和响应的 ...

  9. Asp.Net Core 通过中间件防止图片盗链

    一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...

  10. ASP.NET Core 开发-中间件(Middleware)

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

随机推荐

  1. Spring Security Oauth2 的配置

    使用oauth2保护你的应用,可以分为简易的分为三个步骤 配置资源服务器 配置认证服务器 配置spring security 前两点是oauth2的主体内容,但前面我已经描述过了,spring sec ...

  2. es6箭头函数 this 指向问题

    es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){ ...

  3. react 报错的堆栈处理

    react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...

  4. CentOS 7 下面使用 sendMail 发送邮件

    1. 修改perf的版本不然会报错: ******************************************************************* Using the def ...

  5. HDU 3901 Wildcard

    题目:Wildcard 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3901 题意:给一个原串(只含小写字母)和一个模式串(含小写字母.?.* ,*号可替 ...

  6. Python——Django-manage.py的内容

    在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指定的IP和端口启动 python3 manage. ...

  7. centos 下安装显卡驱动步骤

    一. 先下载自己显卡对应的linux版本的驱动文件, 一般都是.run的一个文件. 二.如果是新安装的系统,先安装编译环境,gcc,kernel-devel,kernel-headers  (联网) ...

  8. python之OpenCv(三)---基本绘图

    opencv 提供了绘制直线.圆形.矩形等基本绘图的功能 1.绘直线 cv2.line(画布,起点坐标,终点坐标,颜色,宽度) 例如: cv2.line(image,(20,60),(300,400) ...

  9. python 第一课 helloworld

    #!/usr/bin/env python #-*-coding:utf-8-*- #以上是配置编写环境的开始 #第一行env表示运行当前环境变量内的python版本(2.x or 3.x) #第二行 ...

  10. tex中pdf外链

    \documentclass{article} \usepackage{hyperref} \begin{document} \href{run:d:/my folder/test.pdf}{This ...