原文: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. MFC的CListCtrl的使用与技巧

    http://blog.csdn.net/artechtor/article/details/2508070 列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属 ...

  2. 选择标识符(identifier)

    整数通常是标识列最好的选择,因为它们很快并且可以使用auto_increment:千万不要使用enum和set类型作为标识列:尽量避免使用字符串类型作为标识列,因为他们很消耗空间,并且通常比数字类型慢 ...

  3. Json入门 分类: C_OHTERS 2014-04-23 16:20 601人阅读 评论(0) 收藏

    参考<疯狂android讲义>>730页 JSON的基础请参考W3SCHOOL的教程: http://www.w3school.com.cn/json/index.asp 例子: h ...

  4. MySQL运行环境部署规范

    一:系统安装规范 1.关闭CPU节能,设定最大性能模式. 2.关闭NUMA(主要是为了避免swap).C-states.C1E. 3.阵列卡策略使用FORCE WB,关闭预读. 4.机械盘时,所有盘组 ...

  5. catalina.out 和 catalina.log 的区别和用途

    catalina.out catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stder ...

  6. 《编程导论(Java)&#183;3.2.4 循环语句》

    本文全然复制<编程导论(Java)·3.2.4 循环语句>的内容.除[]中的说明文字.请阅读和比較其它编程教材. 我知道.假设我是一个刚開始学习的人,<编程导论(Java)>非 ...

  7. 小强的HTML5移动开发之路(53)——jQueryMobile页面间参数传递

    在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...

  8. update中加入select最常用的update语法

    update中加入select最常用的update语法 (转) (2010-08-20 11:40:16) 转载▼ 标签: it 分类: SQL 最常用的update语法是:UPDATE <ta ...

  9. Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能

    最近老大要求做一个类米聊的app,于是就去找解决方案,首先用Android本身的MediaRecorder肯定是不行的,只支持amr,wav,acc,如果要做到Android,Iphone,pc通用的 ...

  10. MySQL crash-safe replication

    MySQL数据库的成功离不开其replicaiton,相对于Oracle DG和Microsoft SQL Server Log Shipping来说,其简单易上手,基本上1,2分钟内根据手册就能完成 ...