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). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...
随机推荐
- c# winform 多屏显示
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- HashMap 与 Hashtable 的区别
Hashtable t 小写 二者用法一致 都实现Map接口 1.HashMap 的键值可以为null,而Hashtable不允许("null" 不是 null 前者是字符串 ...
- xshell中进入PLSQL命令不能使用方向键和退格键的做法(输入后显示乱码)
解决输入退格键为乱码的情况 输入时可以ctrl+backspace进行强制退格,或者使用下面一种方法: 在xshell的连接属性中配置,如下图红圈部分: 彻底解决方向键和退格键的一种办法(未亲测) ...
- webservice异常
webservice的一个常见异常: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error parsing HTTP status line &qu ...
- Python——Pycharm基本设置
一.,模板(加入中文UTF-8) #!/usr/bin/env python # -*- coding:utf-8 -*- 设置方法:file->settings->Editor-> ...
- linux添加超级管理员用户,修改,删除用户
useradd一个用户后,去修改/etc/passwd文件中的这个用户这一行,把其中的uid改为0,gid改为0(其中****代表一个用户名)这样****就具有root权限了 如:root2:x:0: ...
- 帝国cms打开慢
发现有个站(http://www.953239.com/)打开很慢,改了php版本后,快了一倍
- 【系统】libevent库学习
Libevent库 是一个用C语言开发的.轻量级的开源高性能事件通知库,主要功能特点如下: 事件驱动(event-driven),高性能; 注册事件分优先级: 支持 I/O,定时器和信号等事件信息: ...
- [WC2007]剪刀石头布(最大流)
洛古 一句话题意:给定一张图,每两点之间有一条有向边或无向边,把所有无向边定向,使图中三元环个数尽量多 因为原图是一个完全图,假设图中任意三点都能构成三元环,那么途中三元环的个数为:\(\binom{ ...
- 深入理解PHP的运行模式
PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli 命令行运行 ( ...