ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core 中间件
上一章节中,我们我们有讲到 Startup 类中的 Configure() 方法用于定义请求管道中的中间件
ASP.NET Core 中的中间件控制我们的应用程序如何响应 HTTP 请求,它还可以控制我们的应用程序在发生错误时的显示的内容,它是我们认证和授权用户执行特定操作的关键部分
中间件
那么,什么是中间件呢?
中间件是一种装配到应用程序管道以处理请求和响应的组件。
每个组件:
- 可以选择是否将请求传递到管道中的下一个组件。
- 可在调用管道中的下一个组件前后执行工作。
请求委托用于生成请求管道。请求委托处理每个 HTTP 请求。
可以使用 Run、Map 和 Use 扩展方法来配置请求委托。
可将一个单独的请求委托并行指定为匿名方法 ( 称为并行中间件 ) ,或在可重用的类中对其进行定义
这些可重用的类和并行匿名方法即为中间件或中间件组件
请求管道中的每个中间件组件负责调用管道中的下一个组件,或在适当情况下使链发生短路
中间件处理流程
ASP.NET Core 请求管道包含一系列相继调用的请求委托,如下图所示(执行过程遵循黑色箭头)

每个委托均可在下一个委托前后执行操作。
此外,委托还可以决定不将请求传递给下一个委托,这就是对请求管道进行短路。
通常需要短路,因为这样可以避免不必要的工作。
例如,静态文件中间件可以返回静态文件请求并使管道的其余部分短路。
需要尽早在管道中调用异常处理委托,以便它们可以捕获在管道的后期阶段所发生的异常
我们假设想要记录每个请求的信息,而且想要验证每个请求是否被授权,然后才发送到相应的控制器中去处理
在这种情况下,安装到应用程序中的第一件中间件可能就是日志记录组件
记录器可以看到关于传入请求的所有信息,但可能只是记录一些信息, 然后将这个请求传递给下一个中间件

中间件是这个处理流水线中存在的一系列组件
安装到应用程序中的下一个中间件是授权组件
授权组件可能会在 HTTP 标头中寻找特定的 Cookie 信息或访问令牌
如果授权组件发现令牌有效,则继续传递请求给下一个中间件路由器。如果无效,则可以授权组件本身可能会用HTTP 错误代码或重定向代码来响应请求以将用户引导到到登录页面
路由器中间件查看 URL 并确定下一步动作
路由器中间件在应用程序中查找响应的内容,如果路由器没有找到任何响应,则路由器本身可能会返回 404 Not Found 错误
范例
上面的讲解很枯燥,其实真正理解起来很简单,就是流水化的作业
每个新项目默认都会使用 context.Response.WriteAsync 中间件,也就是在 app.Run() 方法中注册的中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
app.Run() 方法允许我们传入另一个方法,我们可以用它来处理每一个单独的响应。Run() 方法不经常见,它是调用中间件的终端
在 app.Run() 方法中注册的中间件永远不会有机会调用另一个中间件,它只会接收请求,然后必须产生某种响应
app.Run() 方法中注册的中间件还可以访问 Response,例如使用 Response 对象返回一个字符串,就前几章节中我们做的那样
如果在 app.Run() 方法之后注册另一个中间件,那么注册的那个中间件永远不会被调用,因为 Run() 方法是注册中间件的 终端,在它之后,永远不会调用下一个中间件
添加另一个中间件
添加另一个中间件的方法很简单,让我们继续以下步骤来添加另一个中间件:
要添加另一个中间件,右键单击项目并选择 添加 -> 添加 NuGet 包
如果你使用的是 Windows 系统,则是选择 管理 NuGet 程序包

在弹出的 添加包管理器中 输入 Microsoft.AspNetCore.Diagnostics

这个包是一个可以用于异常处理,异常显示页面和诊断信息的 ASP.NET Core 中间件,它包含了我们可以使用的许多不同的中间件
选中 Microsoft.AspNetCore.Diagnostics 并点击右下脚的 添加包 按钮
如果你使用的是 Windows 系统,则是选中 Microsoft.AspNetCore.Diagnostics,然后点击右边的 安装 按钮
如果安装失败,可能是因为你的项目中已经默认安装了该 NuGet 包
我苹果电脑默认已经安装,所以安装失败,但 Windows 上却安装成功
然后我们修改
Startup类中的Configure()方法添加中间件app.UseWelcomePagepublic void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseWelcomePage(); app.Run(async (context) =>
{
var msg = Configuration["message"];
await context.Response.WriteAsync(msg);
});
}运行 HelloWorld 项目,刷新浏览器,可以看到显示如下

ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章
- ASP.NETCore学习记录(二) —— ASP.NET Core 中间件
ASP.NET Core 中间件 目录: 什么是中间件 ? IApplicationBuilder 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间 ...
- ASP.NET Core 中间件基本用法
ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件.中间件按照装配的先后顺序执行,并决定是否进入下一个组件.中间件管道的处 ...
- ASP.NET Core 中间件自定义全局异常处理
目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...
- net core 中间件管道
net core 中间件管道 .net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下 ...
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...
- ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...
- ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...
- ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...
- ASP.NET Core Identity 框架 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Identity 框架 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 框架 前面我们使用了 N 多个章节, ...
随机推荐
- ArcSDE:C#打开SDE数据库的几种方式总结
转自原文 ArcSDE:C#打开SDE数据库的几种方式总结 1.通过指定连接属性参数打开数据库 /// <param name="server">数据库服务器名< ...
- 认识PWA
原文 简书原文:https://www.jianshu.com/p/f38f21ed45dc 大纲 前言 1.什么是PWA 2.PWA 应该具备的特点 3.PWA基础 4.构建 PWA 的业务场景 5 ...
- JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\)
JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\) 一.总结 js正则:var patrn=/^[0-9]{1,20}$/; php正则:$pattern='/ ...
- CCPC2016长春站打铁记
Day0 晚上到的长春.很冷.到了宾馆.放了行李.然后就去吃了点火锅.很好吃.在福建吃的都没有酱.但是回去后有点拉肚子..几个队友也有同样的反应.路过了吉大.拍了一张照片.哎.压力好大. Day1 来 ...
- hadoop2.7全然分布式集群搭建以及任务測试
要想深入的学习hadoop数据分析技术,首要的任务是必需要将hadoop集群环境搭建起来,本文主要讲述怎样搭建一套hadoop全然分布式集群环境. 环境配置:2台64位的redhat6.5 + 1台 ...
- VC++ 訪问数据库实例具体解释图解
一 ADO 方式訪问 Access 新建一个对话框project,加入控件,如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2 ...
- 非常实用全面的 C++框架,库类等资源
这次的资源涉及到了标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等,C++程序员学习必备! Jason frozen : C/C++的Jason解析生成器 Jansson ...
- style.height、offsetHeight、clientHeight、scrollHeight的差别
style.height 包含元素的滚动栏,不包含边框 clientHeight 不包含元素的滚动栏和边框 offsetHeight 包含元素的滚动栏和边框 scrollHeight offsetHe ...
- 怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨
从最初学习使用log4j的时候,网上和书本上主要都是使用"log4j.properties"这种属性格式,配置日志.多年以来,一直使用这种格式,总的来说,简单.够用. 而有十 ...
- 【u240】棋子放置
Time Limit: 1 second Memory Limit: 128 MB 小虎刚刚上了幼儿园,老师让他做一个家庭作业:首先画3行格子,第一行有三个格子,第二行有2个格子,第三行有1个格子. ...