ASP.NET Core之中间件
本文翻译自: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之中间件的更多相关文章
- 如何传递参数给ASP.NET Core的中间件(Middleware)
问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...
- asp.net core mvc 中间件之WebpackDevMiddleware
asp.net core mvc 中间件之WebpackDevMiddleware WebpackDevMiddleware中间件主要用于开发SPA应用,启用Webpack,增强网页开发体验.好吧,你 ...
- asp.net core mvc 中间件之路由
asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...
- 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?
原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...
- asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。
原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...
- ASP.NET Core路由中间件[3]: 终结点(Endpoint)
到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...
- ASP.NET Core路由中间件[2]: 路由模式
一个Web应用本质上体现为一组终结点的集合.终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系.借助这个映射关系,客户端可 ...
- ASP.NET Core:中间件
一.什么是中间件 我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中.而中间件就是用于组成应用程序管道来处理请求和响应的 ...
- Asp.Net Core 通过中间件防止图片盗链
一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...
- ASP.NET Core 开发-中间件(Middleware)
ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...
随机推荐
- Mariadb第一章:介绍及安装--小白博客
mariadb(第一章) 数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以 ...
- VS2010安装MVC4记录
想学MVC4,但自己电脑上是VS2010,所以在网上查询怎样安装MVC4,总结下给大家. VS2010默认安装的是MVC2,安装MVC4必须先装 SP1,然后安装MVC4. VS2010 SP1 (1 ...
- SyntaxError: missing ) after argument list
消息 语法错误: 参数列表后面缺少 ) 错误类型 SyntaxError. 什么地方出错了? 有一个函数在调用时出现错误.这可能是一个错误,丢失运算符或者转义字符等. 示例 因为没有使用 ”+“ 操作 ...
- [转载:Q1mi]Bootstrap和基于Bootstrap的登录验证示例
转载自:Q1mi Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支 ...
- 【Android O】 Service AAA does not have a SELinux domain defined
在init.AAA.rc里面添加了一个脚本启动的服务: service AAA /vendor/bin/sh /vendor/etc/AAA_spec.sh user root group root ...
- BZOJ3028食物——生成函数+泰勒展开
题目描述 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应 该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数.他这次又准备带一些 ...
- POJ--3349 Snowflake Snow Snowflakes(数字hash)
链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...
- Python之——CentOS 6.5安装Python2.7.14
Python之——CentOS 6.5安装Python2.7.14 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/l1028386804/art ...
- Awesome CLI
请移步https://github.com/zhuxiaoxi/awesome-online-tools 欢迎一同维护这个列表 jq JSON工具 shellcheck 更好用的Shell语法检查 c ...
- A Reliability-Aware Network Service Chain Provisioning With Delay Guarantees in NFV-Enabled Enterprise Datacenter Networks
文章名称:A Reliability-Aware Network Service Chain Provisioning With Delay Guarantees in NFV-Enabled Ent ...