最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊 ASP.NET Core 中間件和過濾器的區(qū)別解析

 更新時間:2026年04月06日 07:56:43   作者:dotNET 實驗室  
本文介紹了ASP.NETCore中的中間件和過濾器的區(qū)別,總結(jié)了常用內(nèi)置中間件和過濾器,幫助開發(fā)者更好地理解和使用它們,感興趣的朋友跟隨小編一起看看吧

引言

不知道你有沒有在面試中遇到過這樣的問題:"中間件和過濾器的區(qū)別是什么?",或者在平時開發(fā)中思考過:"一個請求進來,ASP.NET Core 到底是怎么一步步處理它的?"

這篇文章就來聊聊,不會涉及太深的源碼,主要面向初級開發(fā)者,幫你建立一個清晰的認知。

先說中間件

中間件是 ASP.NET Core 處理 HTTP 請求的基本部件,是框架本身的組成部分。

每一個請求進來后,按照 Use 的注冊順序,依次經(jīng)過每一個中間件,到達終端后,再按照相反的方向依次返回。一系列中間件串聯(lián)起來,就組成了 ASP.NET Core 的請求管道。這個模型有人叫"洋蔥模型",也有人叫"俄羅斯套娃模型",都是一個意思。

請求 →  中間件A → 中間件B → 中間件C(終端)
響應 ←  中間件A ← 中間件B ←

中間件可以做什么呢?它收到請求后,可以在請求/響應對象上加點佐料(自己的邏輯),然后調(diào)用 next() 把請求傳遞給下一個中間件。如果不調(diào)用 next(),請求就在這里短路了,后面的中間件不會執(zhí)行,這個中間件就成了終端中間件。

下面是一個簡單示例,演示如何自定義一個記錄請求耗時的中間件:

// 定義中間件類
public class TimingMiddleware
{
    private readonly RequestDelegate _next;

    public TimingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var sw = Stopwatch.StartNew();

        // 調(diào)用 next(),請求繼續(xù)往下走
        await _next(context);

        // next() 返回后,響應正在往回走
        sw.Stop();
        Console.WriteLine($"[{context.Request.Path}] 耗時:{sw.ElapsedMilliseconds}ms");
    }
}

// 在 Program.cs 中注冊
var app = builder.Build();

app.UseMiddleware<TimingMiddleware>();  // 注冊自定義中間件

app.UseRouting();
app.UseAuthorization();
app.MapControllers();

app.Run();

如果你不想單獨定義一個類,也可以用 app.Use 直接寫一個內(nèi)聯(lián)中間件:

app.Use(async (context, next) =>
{
    Console.WriteLine($"請求進來了:{context.Request.Path}");

    await next();  // 傳遞給下一個中間件

    Console.WriteLine($"響應回來了:{context.Response.StatusCode}");
});

這里注冊的是終端中間件,不接受 next,請求到這里就結(jié)束了,不會再往下傳:

app.Run(async context =>
{
    await context.Response.WriteAsync("到終點了,不繼續(xù)往下走");
});

再聊過濾器

過濾器是在路由中間件內(nèi)部起作用的。

請求經(jīng)過中間件管道,到達路由中間件后,路由中間件確定了要調(diào)用哪個 Controller / Action。在真正執(zhí)行 Action 的前后,過濾器就夾在這里介入。

用一張簡單的示意圖來表示:

請求進來
  → 中間件們
    → 路由中間件(確定目標 Action)
      → 過濾器們(Action 執(zhí)行前后插手)
        → Action 執(zhí)行
      ← 過濾器們
    ← 路由中間件
  ← 中間件們
響應返回

正因為過濾器處于路由之后,所以它能拿到 MVC 的上下文信息,比如當前是哪個 Action、Action 上有哪些 Attribute、ModelState 是否合法等等。這是普通中間件做不到的,因為中間件執(zhí)行的時候,路由還沒解析呢。

// 定義過濾器類,繼承 ActionFilterAttribute
public class ValidateModelAttribute : ActionFilterAttribute
{
    // 在 Action 執(zhí)行之前觸發(fā)
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            // ModelState 校驗不通過,直接短路,返回 400
            var errors = context.ModelState
                .Where(e => e.Value?.Errors.Count > 0)
                .ToDictionary(
                    e => e.Key,
                    e => e.Value!.Errors.Select(x => x.ErrorMessage).ToArray()
                );

            context.Result = new BadRequestObjectResult(new
            {
                code = 400,
                message = "參數(shù)校驗失敗",
                errors
            });
        }
    }

    // 在 Action 執(zhí)行之后觸發(fā)
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // 可以在這里統(tǒng)一處理響應,比如包一層統(tǒng)一的返回格式
    }
}

使用方式很簡單,直接作為 Attribute 標注在 Controller 或 Action 上:

// 標注在單個 Action 上
[HttpPost]
[ValidateModel]
public IActionResult CreateUser([FromBody] CreateUserRequest request)
{
    // 走到這里說明 ModelState 已經(jīng)通過校驗
    return Ok(new { message = "創(chuàng)建成功" });
}

// 也可以標注在 Controller 上,對所有 Action 生效
[ApiController]
[ValidateModel]
public class UserController : ControllerBase
{
    // ...
}

如果想全局生效,在 Program.cs 里注冊就行:

builder.Services.AddControllers(options =>
{
    options.Filters.Add<ValidateModelAttribute>();  // 全局注冊
});

它倆的區(qū)別

中間件過濾器
作用范圍所有 HTTP 請求,包括靜態(tài)文件僅限 Controller / Action
典型使用場景限流、壓縮、跨域、日志、認證權(quán)限校驗、參數(shù)校驗、統(tǒng)一響應封裝、異常處理

一句話總結(jié):中間件是 HTTP 管道的基礎設施,過濾器是 MVC 系的切面機制,它們不是同一層次的東西。

給你一個小技巧,不確定用哪個的時候,問自己一個問題:我需要知道當前是哪個 Action 嗎? 需要的話用過濾器,不需要的話中間件就夠了。

內(nèi)置清單

最后整理一份 ASP.NET Core 已經(jīng)提供的常用中間件和過濾器,遇到需求的時候先查查有沒有現(xiàn)成的,別重復造輪子。

常用內(nèi)置中間件:

中間件說明
UseRouting路由解析
UseAuthentication認證
UseAuthorization授權(quán)
UseStaticFiles靜態(tài)文件服務
UseCors跨域
UseExceptionHandler全局異常處理
UseHttpsRedirectionHTTPS 重定向
UseResponseCompression響應壓縮
UseRateLimiter限流(.NET 7 新增)

內(nèi)置過濾器:

過濾器說明
[Authorize]授權(quán)校驗
[AllowAnonymous]允許匿名訪問
[RequireHttps]強制 HTTPS
[ValidateAntiForgeryToken]防止 CSRF 攻擊
[ResponseCache]響應緩存
[Produces]指定響應內(nèi)容類型
[Consumes]指定請求內(nèi)容類型

到此這篇關(guān)于聊聊 ASP.NET Core 中間件和過濾器的區(qū)別解析的文章就介紹到這了,更多相關(guān)asp.net core中間件和過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

金沙县| 玛纳斯县| 承德县| 武邑县| 大方县| 扎兰屯市| 凤城市| 都安| 固安县| 德钦县| 利津县| 汪清县| 渝中区| 安乡县| 获嘉县| 邹平县| 丰台区| 大姚县| 景宁| 柯坪县| 丹东市| 长寿区| 宁晋县| 黄石市| 芒康县| 绵阳市| 庐江县| 蒙阴县| 南开区| 中阳县| 逊克县| 锡林浩特市| 廊坊市| 肇州县| 酒泉市| 天峻县| 河池市| 夏邑县| 拜城县| 华蓥市| 乌兰县|