
中间件是ASP.NET Core中最受接待的功能之一。它让你八成结伴收敛苦求/反馈处理,而且极其机动。只需几行app.Use(...)代码,你就能竣事日记纪录、身份考证或CORS功能。
但问题在于:中间件并非老是处治问题的最好器具。
试图在中间件中塞入过多逻辑会导致代码芜乱、路由出错以及期骗法子脆弱不胜。要构建明晰、可珍爱的API,你需要知说念中间件在哪些方面推崇出色,而在哪些方面则不尽如东说念成见。
让咱们来详备分析一下。
中间件的确实用途是什么?实质上,中间件是一个函数,它不错在HTTP苦求/反馈流经ASP.NET Core管说念时对其进行搜检、修改或短路处理。
每个中间件组件:
• 不错拜谒HttpContext• 不错在调用下一个组件之前和之后执行操作• 默许情况下是全局的——会在每个苦求上运行这是一个经典示例:
app.Use(async (context, next) =>
{jz:field.toptypename/}{
Console.WriteLine("Before");
await next.Invoke;
Console.WriteLine("After");
});执行经过会从上至下地穿过管说念,然后再回溯——不错把它念念象成嵌套的try...finally语句。
当你但愿不计划端点逻辑而对苦求进行平庸收敛时,就不错使用中间件。
(图片将被放大闪现)
什么是中间件
中间件何时相等适用中间件在处理横切温煦点时推崇出色——这些逻辑应该在每个苦求上运行,而且不依赖于路由或模子绑定。
最相宜的使用场景:
• 日记纪录和会诊拿获运转/扫尾时辰戳、情景码、苦求体(需严慎处理)。• 全局极端处理用try-catch包裹卑劣逻辑,并纪录结构化失实。• 标头操作调和添加或修改标头(举例,X-Correlation-ID、CORS)。• 区域性开拓/土产货化使用标头或Cookie开拓现时哨程的区域性。• JWT索求在管说念早期将轻量级令牌信息领略为声明。示例:日记纪录中间件public class LoggingMiddleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
Console.WriteLine($"Request: {context.Request.Method} {context.Request.Path}");
await next(context);
Console.WriteLine($"Response: {context.Response.StatusCode}");
}
}然后在Startup.cs中注册它:
builder.Services.AddTransient;
app.UseMiddleware;浅易、全局、明晰。这恰是中间件的最好期骗边幅。
(图片将被放大闪现)
中间件何时会成为坏成见尽管中间件功能重大,但它并非全能药。它无法拜谒好多你经常需要的东西——比如路由参数、模子情景或复杂的依赖注入图。
不要将中间件用于:
• 基于路由的有经营中间件在路由之前运行。context.GetRouteValue("id")正常会复返null,除非你重新排序管说念或明确使用端点路由。• 授权政策政策正常依赖于用户扮装、声明和路由数据。应该使用AuthorizeAttribute或过滤器。• 考证你无法拜谒模子绑定成果或[Required]失实。应该使用ActionFilters或FluentValidation。• 需要好多作用域服务的复杂逻辑中间件不错通过IMiddleware禁受作用域依赖项,但内联lambda抒发式(app.Use(...))是单例的,不成使用像EF Core DbContext这么的作用域服务。反格式示例app.Use(async (context, next) =>
{
var id = context.GetRouteValue("id"); // 可能为null
if (id?.ToString == "admin")
{
// 尝试在这里注入DbContext会导致失实
}
await next;
});这是很脆弱的,很容易出错——尤其是当路由发生变化时。
相比表使用此表算作遴荐逻辑扬弃位置的参考指南。
耀眼中间件的专科妙技当你需要作用域服务时,注册IMiddleware
builder.Services.AddTransient;
app.UseMiddleware;幸免基于URL片断或查询字符串收敛经过应该使用路由或操作过滤器。
组合袖珍、单一干事的中间件将中间件明白为原子单位,举例:
• RequestLoggingMiddleware• ExceptionHandlingMiddleware• CorrelationIdMiddleware这会使你的管说念保抓明晰且易于调试。
中间件是ASP.NET Core苦求生命周期中一个重大的早期钩子,但它并非适用于整个情况。
使用中间件的场景:
• 全局的横切温煦点• 无情景逻辑• 苦求/反馈塑形幸免使用中间件的场景:
• 与路由关系的逻辑• 模子考证• 任何需要深层依赖注入树的情况构建明晰的管说念,而不是逻辑块。让过滤器和收敛器去作念它们联想用来作念的事情。

备案号: