原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core 中间件

上一章节中,我们我们有讲到 Startup 类中的 Configure() 方法用于定义请求管道中的中间件

ASP.NET Core 中的中间件控制我们的应用程序如何响应 HTTP 请求,它还可以控制我们的应用程序在发生错误时的显示的内容,它是我们认证和授权用户执行特定操作的关键部分

中间件

那么,什么是中间件呢?

中间件是一种装配到应用程序管道以处理请求和响应的组件。

每个组件:

  1. 可以选择是否将请求传递到管道中的下一个组件。
  2. 可在调用管道中的下一个组件前后执行工作。

请求委托用于生成请求管道。请求委托处理每个 HTTP 请求。

可以使用 RunMapUse 扩展方法来配置请求委托。

可将一个单独的请求委托并行指定为匿名方法 ( 称为并行中间件 ) ,或在可重用的类中对其进行定义

这些可重用的类和并行匿名方法即为中间件或中间件组件

请求管道中的每个中间件组件负责调用管道中的下一个组件,或在适当情况下使链发生短路

中间件处理流程

ASP.NET Core 请求管道包含一系列相继调用的请求委托,如下图所示(执行过程遵循黑色箭头)

每个委托均可在下一个委托前后执行操作。

此外,委托还可以决定不将请求传递给下一个委托,这就是对请求管道进行短路。

通常需要短路,因为这样可以避免不必要的工作。

例如,静态文件中间件可以返回静态文件请求并使管道的其余部分短路。

需要尽早在管道中调用异常处理委托,以便它们可以捕获在管道的后期阶段所发生的异常

我们假设想要记录每个请求的信息,而且想要验证每个请求是否被授权,然后才发送到相应的控制器中去处理

  1. 在这种情况下,安装到应用程序中的第一件中间件可能就是日志记录组件

  2. 记录器可以看到关于传入请求的所有信息,但可能只是记录一些信息, 然后将这个请求传递给下一个中间件

  3. 中间件是这个处理流水线中存在的一系列组件

  4. 安装到应用程序中的下一个中间件是授权组件

  5. 授权组件可能会在 HTTP 标头中寻找特定的 Cookie 信息或访问令牌

  6. 如果授权组件发现令牌有效,则继续传递请求给下一个中间件路由器。如果无效,则可以授权组件本身可能会用HTTP 错误代码或重定向代码来响应请求以将用户引导到到登录页面

  7. 路由器中间件查看 URL 并确定下一步动作

  8. 路由器中间件在应用程序中查找响应的内容,如果路由器没有找到任何响应,则路由器本身可能会返回 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() 方法是注册中间件的 终端,在它之后,永远不会调用下一个中间件

添加另一个中间件

添加另一个中间件的方法很简单,让我们继续以下步骤来添加另一个中间件:

  1. 要添加另一个中间件,右键单击项目并选择 添加 -> 添加 NuGet 包

    如果你使用的是 Windows 系统,则是选择 管理 NuGet 程序包

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

    这个包是一个可以用于异常处理,异常显示页面和诊断信息的 ASP.NET Core 中间件,它包含了我们可以使用的许多不同的中间件

  3. 选中 Microsoft.AspNetCore.Diagnostics 并点击右下脚的 添加包 按钮

    如果你使用的是 Windows 系统,则是选中 Microsoft.AspNetCore.Diagnostics,然后点击右边的 安装 按钮

    如果安装失败,可能是因为你的项目中已经默认安装了该 NuGet 包

    我苹果电脑默认已经安装,所以安装失败,但 Windows 上却安装成功

  4. 然后我们修改 Startup 类中的 Configure() 方法添加中间件 app.UseWelcomePage

    public 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);
    });
    }
  5. 运行 HelloWorld 项目,刷新浏览器,可以看到显示如下

ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章

  1. ASP.NETCore学习记录(二) —— ASP.NET Core 中间件

    ASP.NET Core 中间件 目录: 什么是中间件 ? IApplicationBuilder 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间 ...

  2. ASP.NET Core 中间件基本用法

    ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件.中间件按照装配的先后顺序执行,并决定是否进入下一个组件.中间件管道的处 ...

  3. ASP.NET Core 中间件自定义全局异常处理

    目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...

  4. net core 中间件管道

    net core 中间件管道 .net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下 ...

  5. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  6. ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

    一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...

  7. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  8. ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...

  9. ASP.NET Core Identity 框架 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 框架 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 框架 前面我们使用了 N 多个章节, ...

随机推荐

  1. 10、V4L2摄像头获取单幅图片测试程序(MMAP模式)

    #include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h> ...

  2. 【z08】乌龟棋

    描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点 ...

  3. css3-11 如何让html中的不规则单词折行

    css3-11 如何让html中的不规则单词折行 一.总结 一句话总结:用word-wrap属性:word-wrap:break-word; 1.word-break和word-wrap的区别? 推荐 ...

  4. 网站访问优化(二):开启apache服务器gzip压缩

    昨天,把带宽从1M升级到2M,使用cdn版本的jquery之后,网站访问速度由平均5s(在禁止缓存的情况下,使用缓存大概在2.8s)下降到2.8s的样子. 今天,继续优化. 第1步:   把图片进行了 ...

  5. 【36.86%】【codeforces 558B】Amr and The Large Array

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. jquery-4 完整表单验证实例

    jquery-4 完整表单验证实例 一.总结 一句话总结:在form的jquery对象中返回false即可终止表单提交. 1.验证的显示错误消息如何布局? 开始时隐藏,出现错误后显示 10 .erro ...

  7. 新版Sublime text3注册码被移除的解决办法

    Sublime Text是风靡世界的文本编辑器,支持多种编程语言,启动时间短,打开文件速度快,插件丰富,让很多程序员爱不释手.但是,对于未注册的Sublime Text, 经常在保存的时候会弹出一个烦 ...

  8. Android的NDK开发(3)————JNI数据类型的详解

    在Java中有两类数据类型:primitive types,如,int, float, char:另一种为reference types,如,类,实例,数组. 注意:数组,不管是对象数组还是基本类型数 ...

  9. 【????】最短路(short)

    问题描述: 给出N个点,M条无向边的简单图,问所有点对之间的最短路. 数据输入: 第1行两个正整数N,M(N<=100,M<=5000) 下面M行,每行3个正整数x, y, w,为一条连接 ...

  10. echarts多条折线图和柱状图实现

    参考链接:echarts官网:http://echarts.baidu.com/原型图(效果图): 图片.png 代码: <!DOCTYPE html> <html> < ...