[译]ASP.NET Core 2.0 中间件
问题
如何创建一个最简单的ASP.NET Core中间件?
答案
使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World! (Run)");
});
}
比较好的创建请求管道的方法是使用IApplicationBuilder上的扩展方法:
public static void RunHelloWorld(this IApplicationBuilder app)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World! (Run)");
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.RunHelloWorld();
}
运行,此时页面显示:

上面我们使用IApplicationBuilder.Run()来配置中间件,另外一种方法是IApplicationBuilder.Use():
public static void UseHelloWorld(this IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello World! (Use)\n");
await next();
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHelloWorld();
app.RunHelloWorld();
}
运行,此时页面显示:

将中间件作为单独的类定义是更好的实践方法:
public class HelloWorldMiddleware
{
private readonly RequestDelegate _next; public HelloWorldMiddleware(RequestDelegate next)
{
_next = next;
} public async Task Invoke(HttpContext context)
{
await context.Response.WriteAsync("Hello World! (Use in Class)\n");
await _next(context);
}
} public static class UseHelloWorldInClassExtensions
{
public static IApplicationBuilder UseHelloWorldInClass(this IApplicationBuilder app)
{
return app.UseMiddleware<HelloWorldMiddleware>();
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHelloWorld();
app.UseHelloWorldInClass();
app.RunHelloWorld();
}
运行,此时页面显示:

讨论
中间件是一个拦截HTTP请求和响应消息的组件。我们通过创建这些组件链,来为我们的应用程序创建一个请求管道。
我们通过Configure()方法的IApplicationBuilder参数来创建这个请求管道,IApplicationBuilder参数有如下方法:
- Run():添加中间件并终止请求管道(也就是说不再调用下一个中间件)。
- Use():添加中间件,使用lambda表达式或者一个具体的类。
- Map():根据请求路径添加中间件。
Run
这个方法接受RequestDelegate委托作为参数,当委托方法被调用时接受HttpContext参数。这个委托方法返回void,因为它会终止请求管道。
Use
这个方法接受Func委托作为参数,此委托方法有两个参数,分别是HttpContext和指向下一个中间件的next,返回空(Task)。如果没有调用下一个中间件,就会终止请求管道(和Run效果一样)。
UserMiddleware
当通过单独类创建中间件时,我们使用UseMiddleware方法,并将具体的实现类型作为泛型参数。
在中间件类中,有两个部分很重要:
1. 构造函数接受RequestDelegate。当调用此委托时会将当前请求传入下一个中间件。
2. 它拥有一个Invoke方法,接收HttpContext参数并返回空(Task)。当需要用到中间件时,框架会主动调用这个方法。
注:在单独类中实现中间件,并用UseMiddleware封装起来是最佳实践。
扩展方法
需要注意扩展方法的不同之处,RunXXX不会返回值,而UseXXX会返回值(IApplicationBuilder)。这是因为Run()终止请求管道,而Use()可能会链接到其他的中间件。
顺序
中间件按照它们在Configure()方法出现的顺序依次被调用。而返回到客户端的响应也会经历相同的中间件管道。
源代码下载
原文:https://tahirnaushad.com/2017/08/14/asp-net-core-middleware/
[译]ASP.NET Core 2.0 中间件的更多相关文章
- [译]ASP.NET Core 2.0 系列文章目录
基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...
- [译]ASP.NET Core 2.0 带初始参数的中间件
问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...
- [译]ASP.NET Core 2.0 全局配置项
问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...
- [译]ASP.NET Core 2.0 机密配置项
问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...
- [译]ASP.NET Core 2.0 会话状态
问题 如何在ASP.NET Core 2.0中存储会话状态? 答案 创建一个空项目,修改Startup类的ConfigureServices()方法,添加会话状态服务和它后台的存储服务: public ...
- [译]ASP.NET Core 2.0 本地文件操作
问题 如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息? 答案 新建一个空项目,修改Startup类,添加访问本地文件所需的服务: public void ConfigureSer ...
- [译]ASP.NET Core 2.0 网址重定向
问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...
- [译]ASP.NET Core 2.0 路由引擎
问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(ISe ...
- [译]ASP.NET Core 2.0 路由引擎之网址生成
问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServi ...
随机推荐
- 201521123001《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 答: 在老师的详细 ...
- 2017JAVA课程设计
1.团队课程设计博客链接 http://www.cnblogs.com/ltykm/p/7063663.html 2.个人负责模块或任务说明 本人任务:定时器具体功能的实现 3.自己的代码提交记录截图 ...
- HashMap 学习心得
1.构造 HashMap 底层数据结构线性数组,HashMap有一个静态内部类Entry,Entry有四个属性,key,value,next,hash Entry就是HashMap键值对实现的一个基础 ...
- linux(2)文件和目录管理(新增,删除,复制,移动,文件和目录权限,文件查找)
一.目录与路径 1.相对路径与绝对路径绝对路径:/开头, cd /usr相对路径:cd ../..2.目录操作(cd:change directory).:当前目录..:上一层目录-:上一个目录~:当 ...
- Spring01-IOC
1,新建一个Java Project 导入如下jar包和apache-commons-logging包 2, 在src目录下创建一个beans.xml的配置文件,先加入schema spring-be ...
- 【Debian 8.8】Java 8 安装以及环境变量配置
事实上可以分为简单的三个步骤: 下载 JDK 压缩包 解压压缩包 配置环境变量 需要注意的是: 所有命令默认在 root 权限下进行! 演示环境是 Debian 8.8 64位 (阿里云学生机) 1. ...
- 渗透相关website
开源安全测试方法论:http://www.isecom.org/research/osstmm.html 信息系统安全评估框架:www.oissg.org/issaf 开放式web应用程序安全项目(O ...
- 翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- STM32获取DHT11温度传感器数据
准备物件 STM32F103C8T6核心板 ST-LINK V2 DHT11 杜邦线若干 连接线 STM32F103C8T6芯片管脚图 管脚说明 连接仿真器 STM32 ST-LINKV2 VCC V ...
- ajax 发送json 后台接收 遍历保存进数据库
前台怎么拿参数的我就不管了我也不会 反正用这个ajax没错 ajax 代码 一定要写明http请求类型 { contentType:"application/x-www-form-ur ...