写点什么

ASP.NET Core 提供模块化 Middleware 组件

  • 2016-03-11
  • 本文字数:1076 字

    阅读完需:约 4 分钟

ASP.NET Core 引入了中间件(middleware)的概念来定义HTTP 管道(pipeline)。中间件是一系列组合在一起形成web 应用程序的组件。这个概念的灵感来源于 OWIN 和 Katana ,在 ASP.NET 早期版本中也提供了类似的功能。

一个中间件是 HTTP 管道中的一个组件。中间件逐个执行,并在管道中链式地调用下一个中间件。每个中间件都可以终止调用链。例如,如果认证过程失败,则认证中间件不会再执行下一个中间件。下图说明了执行流程。

除了 ASP.NET Core 中内置的中间件,我们也可以创建新的中间件。如果需要自定义中间件,可以编写一个类,该类中必须包含以 HttpContext 作为第一个参数的方法。这个方法允许增加其他参数,可以通过依赖注入进行解析。下面的类定义了一个日志中间件:

复制代码
public class RequestLoggerMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_logger = loggerFactory.CreateLogger<requestloggermiddleware>();
}
public async Task Invoke(HttpContext context)
{
_logger.LogInformation("Handling request: " + context.Request.Path);
await _next.Invoke(context);
_logger.LogInformation("Finished handling request.");
}
}
</requestloggermiddleware>

中间件必须在 Startup 类的 Configure 方法中进行注册才可以执行。

复制代码
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<requestloggermiddleware>();
}
</requestloggermiddleware>

一点需要注意的是,中间件的执行顺序依赖于它们添加到管道中的顺序。这就意味着必须花费一些精力确定中间件之间隐含的依赖关系。例如,一个组件要使用会话状态,但是如果它在会话中间件之前执行,则会导致崩溃。

伴随着 ASP.NET Core“为你所用的资源付费”的理念,一些应用程序的性能可能会有所改善,因为只有明确配置的中间件才会执行。该框架不再依赖于 System.Web.dll;组件将以 NuGet 包的形式提供。这也意味着组件的更新将由 NuGet 负责处理,并且每个中间件均可独立更新。

查看英文原文 ASP.NET Core Provides Modularity with Middleware Components


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2016-03-11 18:003938
用户头像

发布了 31 篇内容, 共 10.8 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

一键生成rpc网关服务项目代码,让你轻松实现跨语言、跨平台的服务调用

vison

微服务 Go 语言 gin 代码自动生成 rpc gateway

从软件哲学角度谈 Amazon SageMaker

亚马逊云科技 (Amazon Web Services)

Amazon SageMaker

ChatGPT 在 Python WEB 的Prompt项目分享

马说IT

Python 开发 ChatGPT

如何在 Linux 中查看正在运行的进程?这三个命令轻松实现!

wljslmz

Linux 三周年连更

在oracle apex中的Dialog的做法(第一部门):

back_wang

oracle dialog oracle ebs ebs

音视频八股文(7)-- 音频aac adts

福大大架构师每日一题

音视频 流媒体

《详谈·张勇》

石云升

读书笔记 三周年连更

Selenium操作已经打开的浏览器

IT蜗壳-Tango

三周年连更

sdn网络

乌龟哥哥

三周年连更

【Python实战】Python采集图书信息

BROKEN

三周年连更

和ChatGPT结对完成VS CODE插件项目分享

马说IT

vscode 插件 插件开发 ChatGPT

2022-04-27:用go语言重写ffmpeg的remuxing.c示例。

福大大架构师每日一题

golang ffmpeg

《爱在黎明破晓前 | 我有话要说》

后台技术汇

三周年连更

Java 中的 null 到底是什么?

Java架构历程

Java 三周年连更

Django笔记十八之save函数的继承操作和指定字段更新等实例方法

Hunter熊

Python django save auto_increment primary key

Go 语言中没有枚举类型,但是我们可以这样做

陈明勇

Go golang 枚举 Enum 三周年连更

iOS MachineLearning 系列(9)—— 人物蒙版图生成

珲少

中国厨房更净一步:一场科技“下凡”带来的方太式浪漫

脑极体

华为阅读联手20余家头部内容平台,共建数字化阅读

最新动态

挑战 30 天学完 Python:Day13 列表推导式和Lambda

MegaQi

挑战30天学完Python 三周年连更

ChatGPT-4!又双叒叕写了一本量化交易的书(附下载)

量化投资与机器学习

机器学习 量化投资 ChatGPT4 对冲基金 Quant

Git 速查表:初学者必备的 12 个 Git 命令

Se7en

场景篇-ChatGPT帮我实现发送公众号推文

马说IT

微信公众号 代码生成 ChatGPT

场景篇-ChatGPT帮我搭建博客网站并自动写博客!

马说IT

博客 ChatGPT

NCCL源码解析③:机器内拓扑分析

OneFlow

2023 年要避免的 17 个致命的网站设计错误

海拥(haiyong.site)

三周年连更

Go的内存模型:如何保证并发读写的顺序性?

Jack

2023移动端技术探索

轻口味

android 移动端 行业趋势 三周年连更

干货|SpringBoot JMS(ActiveMQ)API实践应用详解

浅羽技术

Apache 中间件 ​ActiveMQ 消息列队 三周年连更

Bitmap引起的OOM问题

芯动大师

App 三周年连更 Out Of Memory

iOS MachineLearning 系列(8)—— 图片热区分析

珲少

ASP.NET Core提供模块化Middleware组件_.NET_Pierre-Luc Maheu_InfoQ精选文章