写点什么

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:004190
用户头像

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

关注

评论

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

干货|一次完整的性能测试,测试人员需要做什么?

云智慧AIOps社区

测试 性能测试 测试 单元测试 测试类型 测试管理

WPF 与 Winform 的区别以及应用场景

神农写代码

隐私计算技术栈的融合使用之路还很远

易观分析

隐私计算

【CAD】系列Ⅱ

謓泽

3月月更

WPF 项目版本控制以及布局控件

神农写代码

WPF -资源引用、资源字典引用以及容器模板和数据模板

神农写代码

3.17线上|Azure 中国新区域发布会,携创新而来!

白玉兰开源

云计算

it运维工程师的工作是做什么的?累吗?

行云管家

运维 服务器 IT IT运维

# yyds内容盘点 # 一文教会你Python中三种简单函数的使用

程序媛可鸥

Python 人工智能 面试

云平台是什么?知名云平台有哪些?

行云管家

云计算 阿里云 云服务 云平台

区块链能否助力版权“突围”?

CECBC

java培训:使用 Disruptor 做springboot内部消息队列

@零度

JAVA开发 springboot

Nginx 反向代理(二)

神农写代码

AQS 源码流程分析

网易云信

java

WPF-依赖属性、依赖附加属性以及类型转换

神农写代码

元宇宙,帮助土耳其奶牛产了更多奶?

CECBC

基于微信小程序的驾校预约学车平台的概要设计和详细设计

CC同学

大数据培训:HiveSQL技术优化与面试

@零度

Hive SQL 大数据开发

4 月亚马逊云科技培训与认证课程,精彩不容错过!

亚马逊云科技 (Amazon Web Services)

架构师 培训 认证

如何写好单元测试

TroyLiu

Java 单元测试 解耦 测试原则 好的测试是什么样的

建木持续集成平台v2.2.4发布

Jianmu

运维 持续集成 开源社区 自动化平台 建木CI

PendingIntent重定向:一种针对安卓系统和流行App的通用提权方法——BlackHat EU 2021议题详解(上)

安第斯智能云

安全 安卓

CRM复杂业务场景的低代码开发实践

鲸品堂

低代码

petite-vue源码剖析-双向绑定`v-model`的工作原理

CRMEB

web前端培训:Node的重新认识

@零度

前端开发 Node

Nginx反向代理(三)

神农写代码

HBase海量数据高效入仓解决方案

vivo互联网技术

数据库 HBase

#yyds内容盘点# 一文带你搞懂Python中变量与常量

程序媛可鸥

Python 人工智能 面试

中科柏诚本地生活引数字化活水,解银行疫情期困局

联营汇聚

“元宇宙”与“数字孪生”

CECBC

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