QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

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

关注

评论

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

查看Spark任务的详细信息

程序员欣宸

大数据 spark 10月月更

一道SQL注入的简单题_wp

w010w

sql 网络安全 SQL注入 10月月更

OMS 3.4.0 发布,打造更安全易用的数据迁移体验

OceanBase 数据库

经常会采坑的javascript原型应试题

loveX001

JavaScript

面试官:你是怎样进行react组件代码复用的

beifeng1996

React

极客时间运维进阶训练营第二周作业

chenmin

学术加油站|FLAT,一个轻量且高效的基数估计模型

OceanBase 数据库

数据湖(十六):Structured Streaming实时写入Iceberg

Lansonli

数据湖 10月月更

前端常考手写面试题汇总

helloworld1024fd

JavaScript

第九期 - 模块四

wuli洋

2022《中国企业敏捷实践白皮书》调研全面启动

爱吃小舅的鱼

程”风破浪的开发者|python学习之注释

魏铁锤

学习方法 “程”风破浪的开发者

关于前端面试你需要知道的知识点

beifeng1996

React

深入React源码揭开渲染更新流程的面纱

goClient1992

React

说说你对Vue的keep-alive的理解

bb_xiaxia1998

Vue

react源码分析:深度理解React.Context

flyzz177

React

个人头像人工智能生成工具,上线一天就已赚了1万美金

陆通

程序员 AI 赚钱 职场

SAP | 来了解一下事件吧

暮春零贰

SAP 事件 10月月更

长安链源码分析共识机制1

看板在项目管理中的价值

爱吃小舅的鱼

面试官:能用JavaScript手写一个bind函数吗

helloworld1024fd

JavaScript

week3 - 作业

in9

腾讯前端一面必会面试题(边面边更)

loveX001

JavaScript

飞书中板栗看板适合做复杂任务管理吗

爱吃小舅的鱼

深度分析React源码中的合成事件

goClient1992

React

面试官:说说React-SSR的原理

beifeng1996

React

面试官:vue2和vue3的区别有哪些?

bb_xiaxia1998

Vue

三年经验前端vue面试记录

bb_xiaxia1998

Vue

react源码分析:组件的创建和更新

flyzz177

React

谈谈前端性能优化-面试版

loveX001

JavaScript

华为云从入门到实战 | 云服务概述与华为云搭建Web应用

TiAmo

华为 华为云 10月月更

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